Merge "Add comment to build.gradle files" into androidx-main
diff --git a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/graphics/drawable/DrawableContainerCompat.java b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/graphics/drawable/DrawableContainerCompat.java
index 9fd6026..104efb4 100644
--- a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/graphics/drawable/DrawableContainerCompat.java
+++ b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/graphics/drawable/DrawableContainerCompat.java
@@ -32,13 +32,13 @@
import android.os.SystemClock;
import android.util.DisplayMetrics;
import android.util.SparseArray;
+import android.view.View;
import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.core.graphics.drawable.DrawableCompat;
-import androidx.core.view.ViewCompat;
/**
* A helper class that contains several {@link Drawable}s and selects which one to use.
@@ -94,7 +94,7 @@
private boolean needsMirroring() {
return isAutoMirrored()
- && (DrawableCompat.getLayoutDirection(this) == ViewCompat.LAYOUT_DIRECTION_RTL);
+ && (DrawableCompat.getLayoutDirection(this) == View.LAYOUT_DIRECTION_RTL);
}
@Override
diff --git a/appcompat/appcompat/api/restricted_current.txt b/appcompat/appcompat/api/restricted_current.txt
index 1eaac7d..3afd9d3 100644
--- a/appcompat/appcompat/api/restricted_current.txt
+++ b/appcompat/appcompat/api/restricted_current.txt
@@ -2275,7 +2275,7 @@
}
@RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ViewUtils {
- method public static void computeFitSystemWindows(android.view.View!, android.graphics.Rect!, android.graphics.Rect!);
+ method public static void computeFitSystemWindows(android.view.View, android.graphics.Rect, android.graphics.Rect);
method public static boolean isLayoutRtl(android.view.View!);
method public static void makeOptionalFitsSystemWindows(android.view.View!);
}
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/DrawerDynamicLayoutTest.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/DrawerDynamicLayoutTest.java
index 851fbe9..6b2b4c5 100755
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/DrawerDynamicLayoutTest.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/DrawerDynamicLayoutTest.java
@@ -30,7 +30,6 @@
import androidx.annotation.LayoutRes;
import androidx.appcompat.test.R;
import androidx.core.view.GravityCompat;
-import androidx.core.view.ViewCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.test.annotation.UiThreadTest;
import androidx.test.espresso.UiController;
@@ -124,9 +123,9 @@
View child = drawer.getChildAt(i);
final int gravity = ((DrawerLayout.LayoutParams) child.getLayoutParams()).gravity;
final int absGravity = GravityCompat.getAbsoluteGravity(gravity,
- ViewCompat.getLayoutDirection(child));
+ child.getLayoutDirection());
final int gravityInParent = GravityCompat.getAbsoluteGravity(gravity,
- ViewCompat.getLayoutDirection(drawer));
+ drawer.getLayoutDirection());
Log.e("DrawerDynamicLayoutTest", "gravity of child[" + i + "] "
+ " = " + absGravity + "; gravity in parent " + gravityInParent);
}
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/DrawerLayoutDoubleTest.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/DrawerLayoutDoubleTest.java
index 37d13f6..5ec1c80 100755
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/DrawerLayoutDoubleTest.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/DrawerLayoutDoubleTest.java
@@ -30,7 +30,6 @@
import androidx.appcompat.custom.CustomDrawerLayout;
import androidx.appcompat.test.R;
-import androidx.core.view.ViewCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
@@ -161,7 +160,7 @@
@LargeTest
public void testDrawerOpenCloseLtr() {
onView(withId(R.id.drawer_layout)).perform(
- setLayoutDirection(ViewCompat.LAYOUT_DIRECTION_LTR));
+ setLayoutDirection(View.LAYOUT_DIRECTION_LTR));
verifyDrawerOpenClose();
}
@@ -170,7 +169,7 @@
@LargeTest
public void testDrawerOpenCloseRtl() {
onView(withId(R.id.drawer_layout)).perform(
- setLayoutDirection(ViewCompat.LAYOUT_DIRECTION_RTL));
+ setLayoutDirection(View.LAYOUT_DIRECTION_RTL));
verifyDrawerOpenClose();
}
@@ -224,7 +223,7 @@
@LargeTest
public void testDrawerLockUnlockLtr() {
onView(withId(R.id.drawer_layout)).perform(
- setLayoutDirection(ViewCompat.LAYOUT_DIRECTION_LTR));
+ setLayoutDirection(View.LAYOUT_DIRECTION_LTR));
verifyDrawerLockUnlock();
}
@@ -233,7 +232,7 @@
@LargeTest
public void testDrawerLockUnlockRtl() {
onView(withId(R.id.drawer_layout)).perform(
- setLayoutDirection(ViewCompat.LAYOUT_DIRECTION_RTL));
+ setLayoutDirection(View.LAYOUT_DIRECTION_RTL));
verifyDrawerLockUnlock();
}
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/MenuPopupWindowTest.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/MenuPopupWindowTest.java
index 0525b0a..2fd68c0 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/MenuPopupWindowTest.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/MenuPopupWindowTest.java
@@ -19,11 +19,11 @@
import android.content.res.Resources;
import android.os.Build;
import android.view.KeyEvent;
+import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.HeaderViewListAdapter;
import android.widget.ListView;
-import androidx.core.view.ViewCompat;
import androidx.test.annotation.UiThreadTest;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.MediumTest;
@@ -52,7 +52,7 @@
final Resources res = mActivity.getResources();
final Configuration config = res.getConfiguration();
if (Build.VERSION.SDK_INT >= 17
- && ViewCompat.LAYOUT_DIRECTION_RTL == config.getLayoutDirection()) {
+ && View.LAYOUT_DIRECTION_RTL == config.getLayoutDirection()) {
mRetreatEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_RIGHT);
} else {
mRetreatEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_LEFT);
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
index 7d16378..64b429e 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
@@ -1443,7 +1443,7 @@
final boolean shouldAnimateActionModeView() {
// We only to animate the action mode in if the sub decor has already been laid out.
// If it hasn't been laid out, it hasn't been drawn to screen yet.
- return mSubDecorInstalled && mSubDecor != null && ViewCompat.isLaidOut(mSubDecor);
+ return mSubDecorInstalled && mSubDecor != null && mSubDecor.isLaidOut();
}
@Override
@@ -1679,7 +1679,7 @@
// added to the hierarchy at the end of the inflate() call.
return true;
} else if (parent == windowDecor || !(parent instanceof View)
- || ViewCompat.isAttachedToWindow((View) parent)) {
+ || ((View) parent).isAttachedToWindow()) {
// We have either hit the window's decor view, a parent which isn't a View
// (i.e. ViewRootImpl), or an attached view, so we know that the original parent
// is currently added to the view hierarchy. This means that it has not be
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/app/WindowDecorActionBar.java b/appcompat/appcompat/src/main/java/androidx/appcompat/app/WindowDecorActionBar.java
index 8b6627c..ff2e791f1 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/app/WindowDecorActionBar.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/app/WindowDecorActionBar.java
@@ -907,7 +907,7 @@
private boolean shouldAnimateContextView() {
// We only to animate the action mode in if the container view has already been laid out.
// If it hasn't been laid out, it hasn't been drawn to screen yet.
- return ViewCompat.isLaidOut(mContainerView);
+ return mContainerView.isLaidOut();
}
@Override
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/graphics/drawable/DrawerArrowDrawable.java b/appcompat/appcompat/src/main/java/androidx/appcompat/graphics/drawable/DrawerArrowDrawable.java
index bba9fa3..ae0eb0d 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/graphics/drawable/DrawerArrowDrawable.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/graphics/drawable/DrawerArrowDrawable.java
@@ -27,6 +27,7 @@
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
+import android.view.View;
import androidx.annotation.ColorInt;
import androidx.annotation.FloatRange;
@@ -335,12 +336,12 @@
break;
case ARROW_DIRECTION_END:
flipToPointRight = DrawableCompat.getLayoutDirection(this)
- == ViewCompat.LAYOUT_DIRECTION_LTR;
+ == View.LAYOUT_DIRECTION_LTR;
break;
case ARROW_DIRECTION_START:
default:
flipToPointRight = DrawableCompat.getLayoutDirection(this)
- == ViewCompat.LAYOUT_DIRECTION_RTL;
+ == View.LAYOUT_DIRECTION_RTL;
break;
}
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/CascadingMenuPopup.java b/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/CascadingMenuPopup.java
index de4a785..3957a72 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/CascadingMenuPopup.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/CascadingMenuPopup.java
@@ -50,7 +50,6 @@
import androidx.appcompat.widget.MenuPopupWindow;
import androidx.core.internal.view.SupportMenu;
import androidx.core.view.GravityCompat;
-import androidx.core.view.ViewCompat;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -313,8 +312,8 @@
*/
@HorizPosition
private int getInitialMenuPosition() {
- final int layoutDirection = ViewCompat.getLayoutDirection(mAnchorView);
- return layoutDirection == ViewCompat.LAYOUT_DIRECTION_RTL ? HORIZ_POSITION_LEFT :
+ final int layoutDirection = mAnchorView.getLayoutDirection();
+ return layoutDirection == View.LAYOUT_DIRECTION_RTL ? HORIZ_POSITION_LEFT :
HORIZ_POSITION_RIGHT;
}
@@ -741,7 +740,7 @@
if (mRawDropDownGravity != dropDownGravity) {
mRawDropDownGravity = dropDownGravity;
mDropDownGravity = GravityCompat.getAbsoluteGravity(
- dropDownGravity, ViewCompat.getLayoutDirection(mAnchorView));
+ dropDownGravity, mAnchorView.getLayoutDirection());
}
}
@@ -752,7 +751,7 @@
// Gravity resolution may have changed, update from raw gravity.
mDropDownGravity = GravityCompat.getAbsoluteGravity(
- mRawDropDownGravity, ViewCompat.getLayoutDirection(mAnchorView));
+ mRawDropDownGravity, mAnchorView.getLayoutDirection());
}
}
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/ListMenuItemView.java b/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/ListMenuItemView.java
index 20af09b..a952904 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/ListMenuItemView.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/ListMenuItemView.java
@@ -37,7 +37,6 @@
import androidx.annotation.RestrictTo;
import androidx.appcompat.R;
import androidx.appcompat.widget.TintTypedArray;
-import androidx.core.view.ViewCompat;
/**
* The item view for each item in the ListView-based MenuViews.
@@ -100,7 +99,7 @@
protected void onFinishInflate() {
super.onFinishInflate();
- ViewCompat.setBackground(this, mBackground);
+ setBackground(mBackground);
mTitleView = findViewById(R.id.title);
if (mTextAppearance != -1) {
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuPopupHelper.java b/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuPopupHelper.java
index aa98768..7bf848f 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuPopupHelper.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuPopupHelper.java
@@ -37,7 +37,6 @@
import androidx.annotation.StyleRes;
import androidx.appcompat.R;
import androidx.core.view.GravityCompat;
-import androidx.core.view.ViewCompat;
/**
* Presents a menu as a small, simple popup anchored to another view.
@@ -268,7 +267,7 @@
// edge will be aligned with the anchor view. Adjust by the anchor
// width such that the top-right corner is at the X offset.
final int hgrav = GravityCompat.getAbsoluteGravity(mDropDownGravity,
- ViewCompat.getLayoutDirection(mAnchorView)) & Gravity.HORIZONTAL_GRAVITY_MASK;
+ mAnchorView.getLayoutDirection()) & Gravity.HORIZONTAL_GRAVITY_MASK;
if (hgrav == Gravity.RIGHT) {
xOffset -= mAnchorView.getWidth();
}
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/StandardMenuPopup.java b/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/StandardMenuPopup.java
index 3f78039..ef6c140 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/StandardMenuPopup.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/StandardMenuPopup.java
@@ -35,7 +35,6 @@
import androidx.appcompat.R;
import androidx.appcompat.widget.MenuPopupWindow;
-import androidx.core.view.ViewCompat;
/**
* A standard menu popup in which when a submenu is opened, it replaces its parent menu in the
@@ -280,7 +279,7 @@
// As xOffset of parent menu popup is subtracted with Anchor width for Gravity.RIGHT,
// So, again to display sub-menu popup in same xOffset, add the Anchor width.
final int hgrav = Gravity.getAbsoluteGravity(mDropDownGravity,
- ViewCompat.getLayoutDirection(mAnchorView)) & Gravity.HORIZONTAL_GRAVITY_MASK;
+ mAnchorView.getLayoutDirection()) & Gravity.HORIZONTAL_GRAVITY_MASK;
if (hgrav == Gravity.RIGHT) {
horizontalOffset += mAnchorView.getWidth();
}
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionBarContainer.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionBarContainer.java
index 41c14b2..0b01437 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionBarContainer.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionBarContainer.java
@@ -32,7 +32,6 @@
import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.appcompat.R;
-import androidx.core.view.ViewCompat;
/**
* This class acts as a container for the action bar view and action mode context views.
@@ -61,7 +60,7 @@
// Set a transparent background so that we project appropriately.
final Drawable bg = new ActionBarBackgroundDrawable(this);
- ViewCompat.setBackground(this, bg);
+ setBackground(bg);
TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.ActionBar);
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionBarContextView.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionBarContextView.java
index e314c7b..3fbccd1 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionBarContextView.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionBarContextView.java
@@ -67,7 +67,7 @@
final TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, attrs,
R.styleable.ActionMode, defStyle, 0);
- ViewCompat.setBackground(this, a.getDrawable(R.styleable.ActionMode_background));
+ setBackground(a.getDrawable(R.styleable.ActionMode_background));
mTitleStyleRes = a.getResourceId(
R.styleable.ActionMode_titleTextStyle, 0);
mSubtitleStyleRes = a.getResourceId(
@@ -186,7 +186,7 @@
LayoutParams.MATCH_PARENT);
menu.addMenuPresenter(mActionMenuPresenter, mPopupContext);
mMenuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this);
- ViewCompat.setBackground(mMenuView, null);
+ mMenuView.setBackground(null);
addView(mMenuView, layoutParams);
}
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AlertDialogLayout.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AlertDialogLayout.java
index 59a8791..819c18f 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AlertDialogLayout.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AlertDialogLayout.java
@@ -311,7 +311,7 @@
if (layoutGravity < 0) {
layoutGravity = minorGravity;
}
- final int layoutDirection = ViewCompat.getLayoutDirection(this);
+ final int layoutDirection = getLayoutDirection();
final int absoluteGravity = GravityCompat.getAbsoluteGravity(
layoutGravity, layoutDirection);
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatSeekBarHelper.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatSeekBarHelper.java
index 5d5bed5..ada8287 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatSeekBarHelper.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatSeekBarHelper.java
@@ -85,7 +85,7 @@
if (tickMark != null) {
tickMark.setCallback(mView);
- DrawableCompat.setLayoutDirection(tickMark, ViewCompat.getLayoutDirection(mView));
+ DrawableCompat.setLayoutDirection(tickMark, mView.getLayoutDirection());
if (tickMark.isStateful()) {
tickMark.setState(mView.getDrawableState());
}
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatSpinner.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatSpinner.java
index 5d5782e..638e833 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatSpinner.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatSpinner.java
@@ -61,7 +61,6 @@
import androidx.appcompat.view.menu.ShowableListMenu;
import androidx.core.util.ObjectsCompat;
import androidx.core.view.TintableBackgroundView;
-import androidx.core.view.ViewCompat;
import androidx.resourceinspection.annotation.AppCompatShadowedAttributes;
@@ -1084,7 +1083,7 @@
* Simplified version of the the hidden View.isVisibleToUser()
*/
boolean isVisibleToUser(View view) {
- return ViewCompat.isAttachedToWindow(view) && view.getGlobalVisibleRect(mVisibleRect);
+ return view.isAttachedToWindow() && view.getGlobalVisibleRect(mVisibleRect);
}
@Override
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java
index 14c8a92..c62e1f0 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java
@@ -458,7 +458,7 @@
mFontTypeface = typeface;
final TextView textView = textViewWeak.get();
if (textView != null) {
- if (ViewCompat.isAttachedToWindow(textView)) {
+ if (textView.isAttachedToWindow()) {
final int style = mStyle;
textView.post(new Runnable() {
@Override
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ContentFrameLayout.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ContentFrameLayout.java
index 8278e52..6dda3d0 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ContentFrameLayout.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ContentFrameLayout.java
@@ -32,7 +32,6 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
-import androidx.core.view.ViewCompat;
/**
*/
@@ -88,7 +87,7 @@
@RestrictTo(LIBRARY)
public void setDecorPadding(int left, int top, int right, int bottom) {
mDecorPadding.set(left, top, right, bottom);
- if (ViewCompat.isLaidOut(this)) {
+ if (isLaidOut()) {
requestLayout();
}
}
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/LinearLayoutCompat.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/LinearLayoutCompat.java
index 414f5a3..c6f23eb 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/LinearLayoutCompat.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/LinearLayoutCompat.java
@@ -1492,7 +1492,7 @@
if (gravity < 0) {
gravity = minorGravity;
}
- final int layoutDirection = ViewCompat.getLayoutDirection(this);
+ final int layoutDirection = getLayoutDirection();
final int absoluteGravity = GravityCompat.getAbsoluteGravity(gravity,
layoutDirection);
switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
@@ -1561,7 +1561,7 @@
final int[] maxAscent = mMaxAscent;
final int[] maxDescent = mMaxDescent;
- final int layoutDirection = ViewCompat.getLayoutDirection(this);
+ final int layoutDirection = getLayoutDirection();
switch (GravityCompat.getAbsoluteGravity(majorGravity, layoutDirection)) {
case Gravity.RIGHT:
// mTotalLength contains the padding already
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ListPopupWindow.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ListPopupWindow.java
index 116a26a..0045e43 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ListPopupWindow.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ListPopupWindow.java
@@ -53,7 +53,6 @@
import androidx.annotation.StyleRes;
import androidx.appcompat.R;
import androidx.appcompat.view.menu.ShowableListMenu;
-import androidx.core.view.ViewCompat;
import androidx.core.widget.PopupWindowCompat;
import java.lang.reflect.Method;
@@ -666,7 +665,7 @@
PopupWindowCompat.setWindowLayoutType(mPopup, mDropDownWindowLayoutType);
if (mPopup.isShowing()) {
- if (!ViewCompat.isAttachedToWindow(getAnchorView())) {
+ if (!getAnchorView().isAttachedToWindow()) {
//Don't update position if the anchor view is detached from window.
return;
}
@@ -1372,7 +1371,7 @@
@Override
public void run() {
- if (mDropDownList != null && ViewCompat.isAttachedToWindow(mDropDownList)
+ if (mDropDownList != null && mDropDownList.isAttachedToWindow()
&& mDropDownList.getCount() > mDropDownList.getChildCount()
&& mDropDownList.getChildCount() <= mListItemExpandMaximum) {
mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED);
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/MenuPopupWindow.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/MenuPopupWindow.java
index d4781ae..bc3cf31 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/MenuPopupWindow.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/MenuPopupWindow.java
@@ -28,6 +28,7 @@
import android.view.KeyEvent;
import android.view.MenuItem;
import android.view.MotionEvent;
+import android.view.View;
import android.widget.HeaderViewListAdapter;
import android.widget.ListAdapter;
import android.widget.PopupWindow;
@@ -40,7 +41,6 @@
import androidx.appcompat.view.menu.ListMenuItemView;
import androidx.appcompat.view.menu.MenuAdapter;
import androidx.appcompat.view.menu.MenuBuilder;
-import androidx.core.view.ViewCompat;
import java.lang.reflect.Method;
@@ -148,7 +148,7 @@
final Resources res = context.getResources();
final Configuration config = res.getConfiguration();
- if (ViewCompat.LAYOUT_DIRECTION_RTL == config.getLayoutDirection()) {
+ if (View.LAYOUT_DIRECTION_RTL == config.getLayoutDirection()) {
mAdvanceKey = KeyEvent.KEYCODE_DPAD_LEFT;
mRetreatKey = KeyEvent.KEYCODE_DPAD_RIGHT;
} else {
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/SwitchCompat.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/SwitchCompat.java
index 24ca26b..661dfb2 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/SwitchCompat.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/SwitchCompat.java
@@ -1188,7 +1188,7 @@
setOffStateDescriptionOnRAndAbove();
}
- if (getWindowToken() != null && ViewCompat.isLaidOut(this)) {
+ if (getWindowToken() != null && isLaidOut()) {
animateThumbToCheckedState(checked);
} else {
// Immediately move the thumb to the new position.
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/Toolbar.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/Toolbar.java
index 9198f6a..e29acef 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/Toolbar.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/Toolbar.java
@@ -562,7 +562,7 @@
super.onRtlPropertiesChanged(layoutDirection);
ensureContentInsets();
- mContentInsets.setDirection(layoutDirection == ViewCompat.LAYOUT_DIRECTION_RTL);
+ mContentInsets.setDirection(layoutDirection == View.LAYOUT_DIRECTION_RTL);
}
/**
@@ -1571,7 +1571,7 @@
* @see #getContentInsetEndWithActions()
*/
public int getCurrentContentInsetLeft() {
- return ViewCompat.getLayoutDirection(this) == ViewCompat.LAYOUT_DIRECTION_RTL
+ return getLayoutDirection() == View.LAYOUT_DIRECTION_RTL
? getCurrentContentInsetEnd()
: getCurrentContentInsetStart();
}
@@ -1586,7 +1586,7 @@
* @see #getContentInsetEndWithActions()
*/
public int getCurrentContentInsetRight() {
- return ViewCompat.getLayoutDirection(this) == ViewCompat.LAYOUT_DIRECTION_RTL
+ return getLayoutDirection() == View.LAYOUT_DIRECTION_RTL
? getCurrentContentInsetStart()
: getCurrentContentInsetEnd();
}
@@ -1953,7 +1953,7 @@
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
- final boolean isRtl = ViewCompat.getLayoutDirection(this) == ViewCompat.LAYOUT_DIRECTION_RTL;
+ final boolean isRtl = getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
final int width = getWidth();
final int height = getHeight();
final int paddingLeft = getPaddingLeft();
@@ -2267,10 +2267,10 @@
* @param gravity Horizontal gravity to match against
*/
private void addCustomViewsWithGravity(List<View> views, int gravity) {
- final boolean isRtl = ViewCompat.getLayoutDirection(this) == ViewCompat.LAYOUT_DIRECTION_RTL;
+ final boolean isRtl = getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
final int childCount = getChildCount();
final int absGrav = GravityCompat.getAbsoluteGravity(gravity,
- ViewCompat.getLayoutDirection(this));
+ getLayoutDirection());
views.clear();
@@ -2296,7 +2296,7 @@
}
private int getChildHorizontalGravity(int gravity) {
- final int ld = ViewCompat.getLayoutDirection(this);
+ final int ld = getLayoutDirection();
final int absGrav = GravityCompat.getAbsoluteGravity(gravity, ld);
final int hGrav = absGrav & Gravity.HORIZONTAL_GRAVITY_MASK;
switch (hGrav) {
@@ -2305,7 +2305,7 @@
case Gravity.CENTER_HORIZONTAL:
return hGrav;
default:
- return ld == ViewCompat.LAYOUT_DIRECTION_RTL ? Gravity.RIGHT : Gravity.LEFT;
+ return ld == View.LAYOUT_DIRECTION_RTL ? Gravity.RIGHT : Gravity.LEFT;
}
}
@@ -2515,7 +2515,7 @@
Api33Impl.findOnBackInvokedDispatcher(this);
boolean shouldBeRegistered = hasExpandedActionView()
&& currentDispatcher != null
- && ViewCompat.isAttachedToWindow(this)
+ && this.isAttachedToWindow()
&& mBackInvokedCallbackEnabled;
if (shouldBeRegistered && mBackInvokedDispatcher == null) {
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java
index 93c3144..322172b 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java
@@ -650,7 +650,7 @@
@Override
public void setBackgroundDrawable(Drawable d) {
- ViewCompat.setBackground(mToolbar, d);
+ mToolbar.setBackground(d);
}
@Override
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/TooltipCompatHandler.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/TooltipCompatHandler.java
index 97d7f0f..c11c471 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/TooltipCompatHandler.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/TooltipCompatHandler.java
@@ -151,7 +151,7 @@
@SuppressWarnings("deprecation")
void show(boolean fromTouch) {
- if (!ViewCompat.isAttachedToWindow(mAnchor)) {
+ if (!mAnchor.isAttachedToWindow()) {
return;
}
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ViewUtils.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ViewUtils.java
index 4e70f9d..6d5238c 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ViewUtils.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ViewUtils.java
@@ -20,14 +20,18 @@
import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
+import android.graphics.Insets;
import android.graphics.Rect;
import android.os.Build;
import android.util.Log;
import android.view.View;
+import android.view.WindowInsets;
import androidx.annotation.ChecksSdkIntAtLeast;
+import androidx.annotation.DoNotInline;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
-import androidx.core.view.ViewCompat;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@@ -38,6 +42,7 @@
public class ViewUtils {
private static final String TAG = "ViewUtils";
+ private static boolean sInitComputeFitSystemWindowsMethod;
private static Method sComputeFitSystemWindowsMethod;
/**
@@ -46,35 +51,40 @@
@ChecksSdkIntAtLeast(api = 27)
static final boolean SDK_LEVEL_SUPPORTS_AUTOSIZE = Build.VERSION.SDK_INT >= 27;
- static {
- try {
- sComputeFitSystemWindowsMethod = View.class.getDeclaredMethod(
- "computeFitSystemWindows", Rect.class, Rect.class);
- if (!sComputeFitSystemWindowsMethod.isAccessible()) {
- sComputeFitSystemWindowsMethod.setAccessible(true);
- }
- } catch (NoSuchMethodException e) {
- Log.d(TAG, "Could not find method computeFitSystemWindows. Oh well.");
- }
- }
-
private ViewUtils() {}
public static boolean isLayoutRtl(View view) {
- return ViewCompat.getLayoutDirection(view) == ViewCompat.LAYOUT_DIRECTION_RTL;
+ return view.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
}
/**
* Allow calling the hidden method {@code computeFitSystemWindows(Rect, Rect)} through
* reflection on {@code view}.
*/
- @SuppressLint("BanUncheckedReflection")
- public static void computeFitSystemWindows(View view, Rect inoutInsets, Rect outLocalInsets) {
- if (sComputeFitSystemWindowsMethod != null) {
- try {
- sComputeFitSystemWindowsMethod.invoke(view, inoutInsets, outLocalInsets);
- } catch (Exception e) {
- Log.d(TAG, "Could not invoke computeFitSystemWindows", e);
+ public static void computeFitSystemWindows(@NonNull View view, @NonNull Rect inoutInsets,
+ @NonNull Rect outLocalInsets) {
+ if (Build.VERSION.SDK_INT >= 29) {
+ Api29Impl.computeFitSystemWindows(view, inoutInsets, outLocalInsets);
+ } else {
+ if (!sInitComputeFitSystemWindowsMethod) {
+ sInitComputeFitSystemWindowsMethod = true;
+ try {
+ sComputeFitSystemWindowsMethod = View.class.getDeclaredMethod(
+ "computeFitSystemWindows", Rect.class, Rect.class);
+ if (!sComputeFitSystemWindowsMethod.isAccessible()) {
+ sComputeFitSystemWindowsMethod.setAccessible(true);
+ }
+ } catch (NoSuchMethodException e) {
+ Log.d(TAG, "Could not find method computeFitSystemWindows. Oh well.");
+ }
+ }
+
+ if (sComputeFitSystemWindowsMethod != null) {
+ try {
+ sComputeFitSystemWindowsMethod.invoke(view, inoutInsets, outLocalInsets);
+ } catch (Exception e) {
+ Log.d(TAG, "Could not invoke computeFitSystemWindows", e);
+ }
}
}
}
@@ -101,4 +111,24 @@
Log.d(TAG, "Could not invoke makeOptionalFitsSystemWindows", e);
}
}
+
+ @RequiresApi(29)
+ static class Api29Impl {
+ private Api29Impl() {
+ // This class is not instantiable.
+ }
+
+ @DoNotInline
+ static void computeFitSystemWindows(@NonNull View view, @NonNull Rect inoutInsets,
+ @NonNull Rect outLocalInsets) {
+ WindowInsets in =
+ new WindowInsets.Builder()
+ .setSystemWindowInsets(Insets.of(inoutInsets))
+ .build();
+ WindowInsets innerInsets = view.computeSystemWindowInsets(in, outLocalInsets);
+ Insets systemWindowInsets = innerInsets.getSystemWindowInsets();
+ inoutInsets.set(systemWindowInsets.left, systemWindowInsets.top,
+ systemWindowInsets.right, systemWindowInsets.bottom);
+ }
+ }
}
diff --git a/browser/browser/src/main/res/values-te/strings.xml b/browser/browser/src/main/res/values-te/strings.xml
index 8844d82..b268bb3 100644
--- a/browser/browser/src/main/res/values-te/strings.xml
+++ b/browser/browser/src/main/res/values-te/strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="fallback_menu_item_open_in_browser" msgid="3413186855122069269">"బ్రౌజర్లో తెరువు"</string>
- <string name="fallback_menu_item_copy_link" msgid="4566929209979330987">"లింక్ను కాపీ చేయి"</string>
+ <string name="fallback_menu_item_copy_link" msgid="4566929209979330987">"లింక్ను కాపీ చేయండి"</string>
<string name="fallback_menu_item_share_link" msgid="7145444925855055364">"లింక్ను షేర్ చేయి"</string>
<string name="copy_toast_msg" msgid="3260749812566568062">"క్లిప్బోర్డ్కు లింక్ కాపీ చేయబడింది"</string>
</resources>
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt
index f81698e..007b8ec 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt
@@ -176,6 +176,7 @@
if (extension.shouldPublish()) {
project.validatePublishedMultiplatformHasDefault()
}
+ project.registerValidateMultiplatformSourceSetNamingTask()
}
project.disallowAccidentalAndroidDependenciesInKmpProject(kmpExtension)
TaskUpToDateValidator.setup(project, registry)
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXMultiplatformExtension.kt b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXMultiplatformExtension.kt
index 2b6b2b5..310e5ff 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXMultiplatformExtension.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXMultiplatformExtension.kt
@@ -14,22 +14,36 @@
* limitations under the License.
*/
+@file:Suppress("UnstableApiUsage") // KotlinMultiplatformAndroidTarget
+
package androidx.build
import androidx.build.clang.AndroidXClang
import androidx.build.clang.MultiTargetNativeCompilation
import androidx.build.clang.NativeLibraryBundler
import androidx.build.clang.configureCinterop
+import androidx.build.uptodatedness.cacheEvenIfNoOutputs
import com.android.build.api.dsl.KotlinMultiplatformAndroidTarget
import com.android.build.gradle.api.KotlinMultiplatformAndroidPlugin
import groovy.lang.Closure
+import java.io.File
import org.gradle.api.Action
+import org.gradle.api.DefaultTask
import org.gradle.api.GradleException
import org.gradle.api.NamedDomainObjectCollection
import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration
+import org.gradle.api.file.FileCollection
import org.gradle.api.plugins.ExtensionAware
+import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
+import org.gradle.api.tasks.Input
+import org.gradle.api.tasks.InputFiles
+import org.gradle.api.tasks.PathSensitive
+import org.gradle.api.tasks.PathSensitivity
+import org.gradle.api.tasks.TaskAction
+import org.gradle.api.tasks.options.Option
+import org.gradle.work.DisableCachingByDefault
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
@@ -543,3 +557,118 @@
)
}
}
+
+/**
+ * Ensures that multiplatform sources are suffixed with their target platform, ex. `MyClass.jvm.kt`.
+ *
+ * Must be called in afterEvaluate().
+ */
+fun Project.registerValidateMultiplatformSourceSetNamingTask() {
+ val targets = multiplatformExtension?.targets?.filterNot { target -> target.name == "metadata" }
+ if (targets == null || targets.size <= 1) {
+ // We only care about multiplatform projects with more than one target platform.
+ return
+ }
+
+ tasks.register(
+ "validateMultiplatformSourceSetNaming",
+ ValidateMultiplatformSourceSetNaming::class.java
+ ) { task ->
+ targets
+ .filterNot { target -> target.platformType.name == "common" }
+ .forEach { target -> task.addTarget(project, target) }
+ task.rootDir.set(rootDir.path)
+ task.cacheEvenIfNoOutputs()
+ }.also { validateTask ->
+ // Multiplatform projects with no enabled platforms do not actually apply the Kotlin plugin
+ // and therefore do not have the check task. They are skipped unless a platform is enabled.
+ if (project.tasks.findByName("check") != null) {
+ project.addToCheckTask(validateTask)
+ project.addToBuildOnServer(validateTask)
+ }
+ }
+}
+
+@DisableCachingByDefault(because = "Doesn't benefit from caching")
+abstract class ValidateMultiplatformSourceSetNaming : DefaultTask() {
+
+ @get:Input
+ abstract val rootDir: Property<String>
+
+ @InputFiles
+ @PathSensitive(PathSensitivity.RELATIVE)
+ fun getInputFiles(): Collection<FileCollection> = sourceSetMap.values
+
+ private val sourceSetMap: MutableMap<String, FileCollection> = mutableMapOf()
+
+ @set:Option(
+ option = "autoFix",
+ description = "Whether to automatically rename files instead of throwing an exception",
+ )
+ @get:Input
+ var autoFix: Boolean = false
+
+ @TaskAction
+ fun validate() {
+ // Files or entire source sets may duplicated shared across compilations, but it's more
+ // expensive to de-dupe them than to check the suffixes for everything multiple times.
+ for ((sourceFileSuffix, kotlinSourceSet) in sourceSetMap) {
+ for (fileOrDir in kotlinSourceSet) {
+ for (file in fileOrDir.walk()) {
+ // Kotlin source files must be uniquely-named across platforms.
+ if (
+ file.isFile &&
+ file.name.endsWith(".kt") &&
+ !file.name.endsWith(".$sourceFileSuffix.kt")
+ ) {
+ val actualPath = file.toRelativeString(File(rootDir.get()))
+ val expectedName = "${file.name.substringBefore('.')}.$sourceFileSuffix.kt"
+ if (autoFix) {
+ val destFile = File(file.parentFile, expectedName)
+ file.renameTo(destFile)
+ logger.info("Applied fix: $actualPath -> $expectedName")
+ } else {
+ throw GradleException(
+ "Source files for non-common platforms must be suffixed with " +
+ "their target platform. Found '$actualPath' but expected " +
+ "'$expectedName'."
+ )
+ }
+ }
+ }
+ }
+ }
+ }
+
+ fun addTarget(project: Project, target: KotlinTarget) {
+ sourceSetMap[target.preferredSourceFileSuffix] = project.files(
+ target.compilations
+ .filterNot { compilation ->
+ // Don't enforce suffixes for test source sets.
+ compilation.name == "test" ||
+ compilation.name.endsWith("Test")
+ }
+ .flatMap { compilation -> compilation.kotlinSourceSets }
+ .map { kotlinSourceSet -> kotlinSourceSet.kotlin.sourceDirectories }
+ .toTypedArray()
+ )
+ }
+
+ /**
+ * List of Kotlin target names which may be used as source file suffixes. Any target whose name
+ * does not appear in this list will use its [KotlinPlatformType] name.
+ */
+ private val allowedTargetNameSuffixes = setOf(
+ "android",
+ "desktop",
+ "jvm"
+ )
+
+ /** The preferred source file suffix for the target's platform type. */
+ private val KotlinTarget.preferredSourceFileSuffix: String
+ get() = if (allowedTargetNameSuffixes.contains(name)) {
+ name
+ } else {
+ platformType.name
+ }
+}
diff --git a/busytown/androidx_with_metalava.sh b/busytown/androidx_with_metalava.sh
index 56a40a6..7f9356d 100755
--- a/busytown/androidx_with_metalava.sh
+++ b/busytown/androidx_with_metalava.sh
@@ -4,7 +4,7 @@
# Use this flag to temporarily disable `checkApi`
# while landing Metalava w/ breaking API changes
-METALAVA_INTEGRATION_ENFORCED=true
+METALAVA_INTEGRATION_ENFORCED=false
if $METALAVA_INTEGRATION_ENFORCED
then
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/StreamGraphImpl.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/StreamGraphImpl.kt
index 0194989..a2aced6 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/StreamGraphImpl.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/StreamGraphImpl.kt
@@ -42,33 +42,10 @@
import javax.inject.Inject
import kotlinx.atomicfu.atomic
-private val streamIds = atomic(0)
-
-internal fun nextStreamId(): StreamId = StreamId(streamIds.incrementAndGet())
-
-private val outputIds = atomic(0)
-
-internal fun nextOutputId(): OutputId = OutputId(outputIds.incrementAndGet())
-
-private val configIds = atomic(0)
-
-internal fun nextConfigId(): OutputConfigId = OutputConfigId(configIds.incrementAndGet())
-
-private val groupIds = atomic(0)
-
-internal fun nextGroupId(): Int = groupIds.incrementAndGet()
-
-private val previewOutputTypes = listOf(
- OutputStream.OutputType.SURFACE_VIEW,
- OutputStream.OutputType.SURFACE_TEXTURE
-)
-
-private val previewFormats = listOf(StreamFormat.UNKNOWN, StreamFormat.PRIVATE)
-
/**
- * This object keeps track of which surfaces have been configured for each stream. In addition, it
- * will keep track of which surfaces have changed or replaced so that the CaptureSession can be
- * reconfigured if the configured surfaces change.
+ * This object builds an internal graph of inputs and outputs from a graphConfig. It is responsible
+ * for defining the identifiers for each input and output stream, and for building an abstract
+ * representation of the internal camera output configuration(s).
*/
@CameraGraphScope
internal class StreamGraphImpl
@@ -136,8 +113,7 @@
dynamicRangeProfile = output.dynamicRangeProfile,
streamUseCase = output.streamUseCase,
streamUseHint = output.streamUseHint,
- externalOutputConfig =
- (output as? OutputStream.Config.ExternalOutputConfig)?.output
+ externalOutputConfig = getOutputConfigurationOrNull(output)
)
outputConfigMap[output] = outputConfig
outputConfigListBuilder.add(outputConfig)
@@ -179,14 +155,16 @@
}
}
- streams = streamListBuilder
+ val streamSortedByPreview = sortOutputsByPreviewStream(streamListBuilder)
+ val streamSortedByVideo = sortOutputsByVideoStream(streamSortedByPreview)
+
+ streams = streamSortedByVideo
streamIds = streams.map { it.id }.toSet()
_streamMap = streamMapBuilder
- outputConfigs = outputConfigListBuilder
-
- val unsortedOutputs = streams.flatMap { it.outputs }
- val outputsSortedByPreview = sortOutputsByPreviewStream(unsortedOutputs)
- outputs = sortOutputsByVideoStream(outputsSortedByPreview)
+ outputConfigs = outputConfigListBuilder.sortedBy {
+ it.streams.minOf { stream -> streams.indexOf(stream) }
+ }
+ outputs = streams.flatMap { it.outputs }
}
class OutputConfig(
@@ -232,6 +210,15 @@
fun onSurfaceMapUpdated(surfaces: Map<StreamId, Surface>)
}
+ private fun getOutputConfigurationOrNull(
+ outputConfig: OutputStream.Config
+ ): OutputConfiguration? {
+ if (Build.VERSION.SDK_INT >= 33) {
+ return (outputConfig as? OutputStream.Config.ExternalOutputConfig)?.output
+ }
+ return null
+ }
+
private fun computeNextSurfaceGroupId(graphConfig: CameraGraph.Config): Int {
// If there are any existing surfaceGroups, make sure the groups we define do not overlap
// with any existing values.
@@ -292,48 +279,59 @@
* original order.
*/
private fun sortOutputsByPreviewStream(
- unsortedOutputs: List<OutputStream>
- ): List<OutputStream> {
+ unsortedStreams: List<CameraStream>
+ ): List<CameraStream> {
- // Check if any streams have PREVIEW StreamUseCase set
- val (previewStreamPartition, nonPreviewStreamPartition) = unsortedOutputs.partition {
- it.streamUseCase == OutputStream.StreamUseCase.PREVIEW
+ // If any stream explicitly specifies "PREVIEW" for its use case, prioritize those streams
+ val (previewStreamPartition, nonPreviewStreamPartition) = unsortedStreams.partition {
+ it.outputs.any { output -> output.streamUseCase == OutputStream.StreamUseCase.PREVIEW }
}
- // Move streams with PREVIEW StreamUseCase to head of list
if (previewStreamPartition.isNotEmpty()) {
return previewStreamPartition + nonPreviewStreamPartition
}
- // Check if any streams have SURFACE_VIEW and SURFACE_TEXTURE OutputTypes
- val (previewOutputTypePartition, nonPreviewOutputTypePartition) =
- unsortedOutputs.partition { it.outputType in previewOutputTypes }
- // Move streams with SURFACE_VIEW and SURFACE_TEXTURE OutputTypes to head of list
- if (previewOutputTypePartition.isNotEmpty()) {
- val comparator = compareBy<OutputStream> { previewOutputTypes.indexOf(it.outputType) }
- return previewOutputTypePartition.sortedWith(comparator) + nonPreviewOutputTypePartition
+ // If no streams explicitly specify the PREVIEW UseCase, fall back to ordering by
+ // SURFACE_VIEW / SURFACE_TEXTURE output types.
+ val (previewTypePartition, nonPreviewTypePartition) = unsortedStreams.partition {
+ it.outputs.any { output -> output.outputType in previewOutputTypes }
+ }
+ if (previewTypePartition.isNotEmpty()) {
+ return previewTypePartition.sortedWith(previewOutputTypesComparator) +
+ nonPreviewTypePartition
}
// Check if any streams have UNKNOWN and PRIVATE StreamFormats
- val (previewFormatPartition, nonPreviewFormatPartition) = unsortedOutputs.partition {
- it.format in previewFormats
+ val (previewFormatPartition, nonPreviewFormatPartition) = unsortedStreams.partition {
+ it.outputs.any { output -> output.format in previewFormats }
}
// Move streams with UNKNOWN and PRIVATE StreamFormats to head of list
if (previewFormatPartition.isNotEmpty()) {
- val comparator = compareBy<OutputStream> { previewFormats.indexOf(it.format) }
- return previewFormatPartition.sortedWith(comparator) + nonPreviewFormatPartition
+ return previewFormatPartition.sortedWith(previewFormatComparator) +
+ nonPreviewFormatPartition
}
// Return outputs in original order if no preview streams found
- return unsortedOutputs
+ return unsortedStreams
}
+ /**
+ * Sort the output streams to move video streams to the bottom of the list.
+ * The order of the outputs is determined by the following:
+ *
+ * 1. StreamUseCase: Check if any streams have StreamUseCase.VIDEO_RECORD and move these to the
+ * bottom of the list. Otherwise, go to step 2.
+ * 2. StreamUseHint: Check if any streams have StreamUseHint.VIDEO_RECORD and move these to the
+ * bottom of the list.
+ */
private fun sortOutputsByVideoStream(
- unsortedOutputs: List<OutputStream>
- ): List<OutputStream> {
+ unsortedOutputs: List<CameraStream>
+ ): List<CameraStream> {
// Check if any streams have VIDEO StreamUseCase set
val (videoStreamPartition, nonVideoStreamPartition) = unsortedOutputs.partition {
- it.streamUseCase == OutputStream.StreamUseCase.VIDEO_RECORD
+ it.outputs.any { output ->
+ output.streamUseCase == OutputStream.StreamUseCase.VIDEO_RECORD
+ }
}
// Move streams with VIDEO StreamUseCase to end of list
if (videoStreamPartition.isNotEmpty()) {
@@ -342,7 +340,9 @@
// Check if any streams have VIDEO StreamUseCaseHint set
val (videoStreamHintPartition, nonVideoStreamHintPartition) = unsortedOutputs.partition {
- it.streamUseHint == OutputStream.StreamUseHint.VIDEO_RECORD
+ it.outputs.any { output ->
+ output.streamUseHint == OutputStream.StreamUseHint.VIDEO_RECORD
+ }
}
// Move streams with VIDEO StreamUseCaseHint to end of list
@@ -353,6 +353,39 @@
// Return outputs in original order if no video streams found
return unsortedOutputs
}
+
+ companion object {
+ private val streamIds = atomic(0)
+
+ internal fun nextStreamId(): StreamId = StreamId(streamIds.incrementAndGet())
+
+ private val outputIds = atomic(0)
+
+ internal fun nextOutputId(): OutputId = OutputId(outputIds.incrementAndGet())
+
+ private val configIds = atomic(0)
+
+ internal fun nextConfigId(): OutputConfigId = OutputConfigId(configIds.incrementAndGet())
+
+ private val groupIds = atomic(0)
+
+ internal fun nextGroupId(): Int = groupIds.incrementAndGet()
+
+ private val previewOutputTypes = listOf(
+ OutputStream.OutputType.SURFACE_VIEW,
+ OutputStream.OutputType.SURFACE_TEXTURE
+ )
+
+ private val previewOutputTypesComparator = compareBy<CameraStream> {
+ it.outputs.maxOf { output -> previewOutputTypes.indexOf(output.outputType) }
+ }
+
+ private val previewFormats = listOf(StreamFormat.UNKNOWN, StreamFormat.PRIVATE)
+
+ private val previewFormatComparator = compareBy<CameraStream> {
+ it.outputs.maxOf { output -> previewFormats.indexOf(output.format) }
+ }
+ }
}
@JvmInline
diff --git a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/StreamGraphImplTest.kt b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/StreamGraphImplTest.kt
index 46e44df..cd22cf5 100644
--- a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/StreamGraphImplTest.kt
+++ b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/graph/StreamGraphImplTest.kt
@@ -81,7 +81,6 @@
@Test
fun testStreamWithMultipleOutputs() {
-
val streamConfig =
CameraStream.Config.create(
listOf(
@@ -104,313 +103,335 @@
@Test
fun testOutputSortingWithStreamUseCase() {
-
- val streamConfig =
- CameraStream.Config.create(
- listOf(
- OutputStream.Config.create(
- Size(800, 600), StreamFormat.UNKNOWN,
- streamUseCase = OutputStream.StreamUseCase.VIDEO_RECORD
- ),
- OutputStream.Config.create(
- Size(1600, 1200), StreamFormat.UNKNOWN,
- streamUseCase = OutputStream.StreamUseCase.PREVIEW
- ),
- OutputStream.Config.create(
- Size(800, 600), StreamFormat.UNKNOWN,
- streamUseCase = OutputStream.StreamUseCase.DEFAULT
- ),
- )
- )
+ val streamConfigA = CameraStream.Config.create(
+ Size(800, 600),
+ StreamFormat.UNKNOWN,
+ streamUseCase = OutputStream.StreamUseCase.VIDEO_RECORD
+ )
+ val streamConfigB = CameraStream.Config.create(
+ Size(1600, 1200),
+ StreamFormat.UNKNOWN,
+ streamUseCase = OutputStream.StreamUseCase.PREVIEW
+ )
+ val streamConfigC = CameraStream.Config.create(
+ Size(800, 600),
+ StreamFormat.UNKNOWN,
+ streamUseCase = OutputStream.StreamUseCase.DEFAULT
+ )
val graphConfig =
CameraGraph.Config(
camera = CameraId("0"),
- streams = listOf(streamConfig),
+ streams = listOf(
+ streamConfigA,
+ streamConfigB,
+ streamConfigC
+ ),
)
+
val streamGraph = StreamGraphImpl(config.fakeMetadata, graphConfig)
- val stream1 = streamGraph.outputs[0]
- assertThat(stream1.streamUseCase).isEqualTo(OutputStream.StreamUseCase.PREVIEW)
+ // Get the stream for each streamConfig
+ val streamA = streamGraph[streamConfigA]
+ val streamB = streamGraph[streamConfigB]
+ val streamC = streamGraph[streamConfigC]
- val stream2 = streamGraph.outputs[1]
- assertThat(stream2.streamUseCase).isEqualTo(OutputStream.StreamUseCase.DEFAULT)
+ // Read the list of outputConfigs (in order)
+ val outputConfigAt0 = streamGraph.outputConfigs[0]
+ val outputConfigAt1 = streamGraph.outputConfigs[1]
+ val outputConfigAt2 = streamGraph.outputConfigs[2]
- val stream3 = streamGraph.outputs[2]
- assertThat(stream3.streamUseCase).isEqualTo(OutputStream.StreamUseCase.VIDEO_RECORD)
+ // Assert that the outputConfig order is B, C, A because:
+ // B is moved to the front of the list, because it is a PREVIEW stream.
+ // A is moved to the end of the list, because it is a VIDEO_RECORD output stream
+ assertThat(outputConfigAt0.streams).containsExactly(streamB)
+ assertThat(outputConfigAt1.streams).containsExactly(streamC)
+ assertThat(outputConfigAt2.streams).containsExactly(streamA)
}
@Test
fun testOutputSortingWithOutputType() {
-
- val streamConfig =
- CameraStream.Config.create(
- listOf(
- OutputStream.Config.create(
- Size(800, 600), StreamFormat.UNKNOWN,
- outputType = OutputStream.OutputType.SURFACE
- ),
- OutputStream.Config.create(
- Size(1600, 1200), StreamFormat.UNKNOWN,
- outputType = OutputStream.OutputType.SURFACE_TEXTURE
- ),
- OutputStream.Config.create(
- Size(800, 600), StreamFormat.UNKNOWN,
- outputType = OutputStream.OutputType.SURFACE_VIEW
- ),
- )
- )
+ val streamConfigA = CameraStream.Config.create(
+ Size(800, 600),
+ StreamFormat.UNKNOWN,
+ outputType = OutputStream.OutputType.SURFACE
+ )
+ val streamConfigB = CameraStream.Config.create(
+ Size(1600, 1200),
+ StreamFormat.UNKNOWN,
+ outputType = OutputStream.OutputType.SURFACE_TEXTURE
+ )
+ val streamConfigC = CameraStream.Config.create(
+ Size(800, 600),
+ StreamFormat.UNKNOWN,
+ outputType = OutputStream.OutputType.SURFACE_VIEW
+ )
val graphConfig =
CameraGraph.Config(
camera = CameraId("0"),
- streams = listOf(streamConfig),
+ streams = listOf(
+ streamConfigA,
+ streamConfigB,
+ streamConfigC
+ ),
)
+
val streamGraph = StreamGraphImpl(config.fakeMetadata, graphConfig)
- val stream1 = streamGraph.outputs[0]
- val stream2 = streamGraph.outputs[1]
- val stream3 = streamGraph.outputs[2]
+ // Get the stream for each streamConfig
+ val streamA = streamGraph[streamConfigA]
+ val streamB = streamGraph[streamConfigB]
+ val streamC = streamGraph[streamConfigC]
+
+ // Read the list of outputConfigs (in order)
+ val outputConfigAt0 = streamGraph.outputConfigs[0]
+ val outputConfigAt1 = streamGraph.outputConfigs[1]
+ val outputConfigAt2 = streamGraph.outputConfigs[2]
if (deferredStreamsAreSupported(config.fakeMetadata, graphConfig)) {
- assertThat(stream1.outputType).isEqualTo(OutputStream.OutputType.SURFACE_VIEW)
- assertThat(stream2.outputType).isEqualTo(OutputStream.OutputType.SURFACE_TEXTURE)
- assertThat(stream3.outputType).isNull()
+ // Assert that the outputConfig order is C, B, A because:
+ // B and C are moved to the front of the list because they are SURFACE_VIEW/SURFACE_TEXTURE
+ // C is sorted before B because SURFACE_VIEW has higher precedence than SURFACE_TEXTURE
+ assertThat(outputConfigAt0.streams).containsExactly(streamC)
+ assertThat(outputConfigAt1.streams).containsExactly(streamB)
+ assertThat(outputConfigAt2.streams).containsExactly(streamA)
} else {
- assertThat(stream1.outputType).isNull()
- assertThat(stream2.outputType).isNull()
- assertThat(stream3.outputType).isNull()
+ // If deferred streams are not supported, the difference between
+ // SURFACE_VIEW/SURFACE_TEXTURE do not matter, and the order is preserved.
+ assertThat(outputConfigAt0.streams).containsExactly(streamA)
+ assertThat(outputConfigAt1.streams).containsExactly(streamB)
+ assertThat(outputConfigAt2.streams).containsExactly(streamC)
}
}
@Test
fun testOutputSortingWithStreamFormat() {
-
- val streamConfig =
- CameraStream.Config.create(
- listOf(
- OutputStream.Config.create(
- Size(800, 600), StreamFormat.PRIVATE
- ),
- OutputStream.Config.create(
- Size(1600, 1200), StreamFormat.UNKNOWN
- ),
- OutputStream.Config.create(
- Size(800, 600), StreamFormat.DEPTH_POINT_CLOUD
- ),
- )
- )
+ val streamConfigA = CameraStream.Config.create(
+ Size(800, 600),
+ StreamFormat.DEPTH_POINT_CLOUD
+ )
+ val streamConfigB = CameraStream.Config.create(
+ Size(1600, 1200),
+ StreamFormat.PRIVATE
+ )
+ val streamConfigC = CameraStream.Config.create(
+ Size(800, 600),
+ StreamFormat.UNKNOWN
+ )
val graphConfig =
CameraGraph.Config(
camera = CameraId("0"),
- streams = listOf(streamConfig),
+ streams = listOf(
+ streamConfigA,
+ streamConfigB,
+ streamConfigC
+ ),
)
+
val streamGraph = StreamGraphImpl(config.fakeMetadata, graphConfig)
- val stream1 = streamGraph.outputs[0]
- assertThat(stream1.format).isEqualTo(StreamFormat.UNKNOWN)
+ // Get the stream for each streamConfig
+ val streamA = streamGraph[streamConfigA]
+ val streamB = streamGraph[streamConfigB]
+ val streamC = streamGraph[streamConfigC]
- val stream2 = streamGraph.outputs[1]
- assertThat(stream2.format).isEqualTo(StreamFormat.PRIVATE)
+ // Read the list of outputConfigs (in order)
+ val outputConfigAt0 = streamGraph.outputConfigs[0]
+ val outputConfigAt1 = streamGraph.outputConfigs[1]
+ val outputConfigAt2 = streamGraph.outputConfigs[2]
- val stream3 = streamGraph.outputs[2]
- assertThat(stream3.format).isEqualTo(StreamFormat.DEPTH_POINT_CLOUD)
+ // Assert that the outputConfig order is C, B, A because:
+ // B and C are moved to the front of the list because they are UNKNOWN/PRIVATE
+ // C is sorted before B because UNKNOWN has higher precedence than PRIVATE
+ assertThat(outputConfigAt0.streams).containsExactly(streamC)
+ assertThat(outputConfigAt1.streams).containsExactly(streamB)
+ assertThat(outputConfigAt2.streams).containsExactly(streamA)
}
@Test
fun testOutputSortingWithNoConditionsMet() {
-
- val streamConfig =
- CameraStream.Config.create(
- listOf(
- OutputStream.Config.create(
- Size(800, 600), StreamFormat.YUV_420_888,
- streamUseCase = OutputStream.StreamUseCase.DEFAULT,
- outputType = OutputStream.OutputType.SURFACE
- ),
- OutputStream.Config.create(
- Size(1600, 1200), StreamFormat.DEPTH16,
- streamUseCase = OutputStream.StreamUseCase.DEFAULT,
- outputType = OutputStream.OutputType.SURFACE
- ),
- OutputStream.Config.create(
- Size(800, 600), StreamFormat.JPEG,
- streamUseCase = OutputStream.StreamUseCase.VIDEO_CALL,
- outputType = OutputStream.OutputType.SURFACE
- ),
- )
- )
+ val streamConfigA = CameraStream.Config.create(
+ Size(800, 600),
+ StreamFormat.YUV_420_888
+ )
+ val streamConfigB = CameraStream.Config.create(
+ Size(1600, 1200),
+ StreamFormat.YUV_420_888
+ )
+ val streamConfigC = CameraStream.Config.create(
+ Size(800, 600),
+ StreamFormat.YUV_420_888
+ )
val graphConfig =
CameraGraph.Config(
camera = CameraId("0"),
- streams = listOf(streamConfig),
+ streams = listOf(
+ streamConfigA,
+ streamConfigB,
+ streamConfigC
+ ),
)
+
val streamGraph = StreamGraphImpl(config.fakeMetadata, graphConfig)
- val stream1 = streamGraph.outputs[0]
- assertThat(stream1.format).isEqualTo(StreamFormat.YUV_420_888)
+ // Get the stream for each streamConfig
+ val streamA = streamGraph[streamConfigA]
+ val streamB = streamGraph[streamConfigB]
+ val streamC = streamGraph[streamConfigC]
- val stream2 = streamGraph.outputs[1]
- assertThat(stream2.format).isEqualTo(StreamFormat.DEPTH16)
+ // Read the list of outputConfigs (in order)
+ val outputConfigAt0 = streamGraph.outputConfigs[0]
+ val outputConfigAt1 = streamGraph.outputConfigs[1]
+ val outputConfigAt2 = streamGraph.outputConfigs[2]
- val stream3 = streamGraph.outputs[2]
- assertThat(stream3.format).isEqualTo(StreamFormat.JPEG)
+ // Assert that the outputConfig order is A, B, C.
+ assertThat(outputConfigAt0.streams).containsExactly(streamA)
+ assertThat(outputConfigAt1.streams).containsExactly(streamB)
+ assertThat(outputConfigAt2.streams).containsExactly(streamC)
}
@Test
fun testOutputSortingWithSameStreamUseCase() {
-
- val streamConfig =
- CameraStream.Config.create(
- listOf(
- OutputStream.Config.create(
- Size(800, 600), StreamFormat.PRIVATE,
- streamUseCase = OutputStream.StreamUseCase.PREVIEW,
- outputType = OutputStream.OutputType.SURFACE_TEXTURE
- ),
- OutputStream.Config.create(
- Size(1600, 1200), StreamFormat.UNKNOWN,
- streamUseCase = OutputStream.StreamUseCase.PREVIEW,
- outputType = OutputStream.OutputType.SURFACE_VIEW
- ),
- OutputStream.Config.create(
- Size(800, 600), StreamFormat.RAW12,
- streamUseCase = OutputStream.StreamUseCase.PREVIEW,
- outputType = OutputStream.OutputType.SURFACE
- ),
- )
- )
+ val streamConfigA = CameraStream.Config.create(
+ Size(800, 600),
+ StreamFormat.RAW12,
+ streamUseCase = OutputStream.StreamUseCase.PREVIEW,
+ outputType = OutputStream.OutputType.SURFACE
+ )
+ val streamConfigB = CameraStream.Config.create(
+ Size(1600, 1200),
+ StreamFormat.UNKNOWN,
+ streamUseCase = OutputStream.StreamUseCase.PREVIEW,
+ outputType = OutputStream.OutputType.SURFACE_VIEW
+ )
+ val streamConfigC = CameraStream.Config.create(
+ Size(800, 600),
+ StreamFormat.PRIVATE,
+ streamUseCase = OutputStream.StreamUseCase.PREVIEW,
+ outputType = OutputStream.OutputType.SURFACE_TEXTURE
+ )
val graphConfig =
CameraGraph.Config(
camera = CameraId("0"),
- streams = listOf(streamConfig),
+ streams = listOf(
+ streamConfigA,
+ streamConfigB,
+ streamConfigC
+ ),
)
+
val streamGraph = StreamGraphImpl(config.fakeMetadata, graphConfig)
- val stream1 = streamGraph.outputs[0]
- assertThat(stream1.format).isEqualTo(StreamFormat.PRIVATE)
+ // Get the stream for each streamConfig
+ val streamA = streamGraph[streamConfigA]
+ val streamB = streamGraph[streamConfigB]
+ val streamC = streamGraph[streamConfigC]
- val stream2 = streamGraph.outputs[1]
- assertThat(stream2.format).isEqualTo(StreamFormat.UNKNOWN)
+ // Read the list of outputConfigs (in order)
+ val outputConfigAt0 = streamGraph.outputConfigs[0]
+ val outputConfigAt1 = streamGraph.outputConfigs[1]
+ val outputConfigAt2 = streamGraph.outputConfigs[2]
- val stream3 = streamGraph.outputs[2]
- assertThat(stream3.format).isEqualTo(StreamFormat.RAW12)
+ // Assert that the outputConfig order is A, B, C:
+ // All outputs specify StreamUseCase.PREVIEW, and any additional ordering is preserved.
+ assertThat(outputConfigAt0.streams).containsExactly(streamA)
+ assertThat(outputConfigAt1.streams).containsExactly(streamB)
+ assertThat(outputConfigAt2.streams).containsExactly(streamC)
}
@Test
fun testOutputSortingWithSameOutputType() {
-
- val streamConfig =
- CameraStream.Config.create(
- listOf(
- OutputStream.Config.create(
- Size(800, 600), StreamFormat.UNKNOWN,
- streamUseCase = OutputStream.StreamUseCase.DEFAULT,
- outputType = OutputStream.OutputType.SURFACE_TEXTURE
- ),
- OutputStream.Config.create(
- Size(1600, 1200), StreamFormat.UNKNOWN,
- streamUseCase = OutputStream.StreamUseCase.VIDEO_CALL,
- outputType = OutputStream.OutputType.SURFACE_TEXTURE
- ),
- OutputStream.Config.create(
- Size(800, 600), StreamFormat.UNKNOWN,
- streamUseCase = OutputStream.StreamUseCase.STILL_CAPTURE,
- outputType = OutputStream.OutputType.SURFACE_TEXTURE
- ),
- )
- )
+ val streamConfigA = CameraStream.Config.create(
+ Size(800, 600),
+ StreamFormat.UNKNOWN,
+ streamUseCase = OutputStream.StreamUseCase.DEFAULT,
+ outputType = OutputStream.OutputType.SURFACE_TEXTURE
+ )
+ val streamConfigB = CameraStream.Config.create(
+ Size(1600, 1200),
+ StreamFormat.UNKNOWN,
+ streamUseCase = OutputStream.StreamUseCase.VIDEO_CALL,
+ outputType = OutputStream.OutputType.SURFACE_TEXTURE
+ )
+ val streamConfigC = CameraStream.Config.create(
+ Size(800, 600),
+ StreamFormat.UNKNOWN,
+ streamUseCase = OutputStream.StreamUseCase.STILL_CAPTURE,
+ outputType = OutputStream.OutputType.SURFACE_TEXTURE
+ )
val graphConfig =
CameraGraph.Config(
camera = CameraId("0"),
- streams = listOf(streamConfig),
+ streams = listOf(
+ streamConfigA,
+ streamConfigB,
+ streamConfigC
+ ),
)
+
val streamGraph = StreamGraphImpl(config.fakeMetadata, graphConfig)
- val stream1 = streamGraph.outputs[0]
- assertThat(stream1.streamUseCase).isEqualTo(OutputStream.StreamUseCase.DEFAULT)
+ // Get the stream for each streamConfig
+ val streamA = streamGraph[streamConfigA]
+ val streamB = streamGraph[streamConfigB]
+ val streamC = streamGraph[streamConfigC]
- val stream2 = streamGraph.outputs[1]
- assertThat(stream2.streamUseCase).isEqualTo(OutputStream.StreamUseCase.VIDEO_CALL)
+ // Read the list of outputConfigs (in order)
+ val outputConfigAt0 = streamGraph.outputConfigs[0]
+ val outputConfigAt1 = streamGraph.outputConfigs[1]
+ val outputConfigAt2 = streamGraph.outputConfigs[2]
- val stream3 = streamGraph.outputs[2]
- assertThat(stream3.streamUseCase).isEqualTo(OutputStream.StreamUseCase.STILL_CAPTURE)
- }
-
- @Test
- fun testOutputSortingWithSameImageFormat() {
-
- val streamConfig =
- CameraStream.Config.create(
- listOf(
- OutputStream.Config.create(
- Size(800, 600), StreamFormat.UNKNOWN,
- streamUseCase = OutputStream.StreamUseCase.VIDEO_RECORD,
- outputType = OutputStream.OutputType.SURFACE
- ),
- OutputStream.Config.create(
- Size(1600, 1200), StreamFormat.UNKNOWN,
- streamUseCase = OutputStream.StreamUseCase.VIDEO_CALL,
- outputType = OutputStream.OutputType.SURFACE
- ),
- OutputStream.Config.create(
- Size(800, 600), StreamFormat.UNKNOWN,
- streamUseCase = OutputStream.StreamUseCase.STILL_CAPTURE,
- outputType = OutputStream.OutputType.SURFACE
- ),
- )
- )
- val graphConfig =
- CameraGraph.Config(
- camera = CameraId("0"),
- streams = listOf(streamConfig),
- )
- val streamGraph = StreamGraphImpl(config.fakeMetadata, graphConfig)
-
- val stream1 = streamGraph.outputs[0]
- assertThat(stream1.streamUseCase).isEqualTo(OutputStream.StreamUseCase.VIDEO_CALL)
-
- val stream2 = streamGraph.outputs[1]
- assertThat(stream2.streamUseCase).isEqualTo(OutputStream.StreamUseCase.STILL_CAPTURE)
-
- val stream3 = streamGraph.outputs[2]
- assertThat(stream3.streamUseCase).isEqualTo(OutputStream.StreamUseCase.VIDEO_RECORD)
+ // Assert that the outputConfig order is A, B, C because all outputType are SURFACE_TEXTURE,
+ // and order should be preserved since there are no other conditions.
+ assertThat(outputConfigAt0.streams).containsExactly(streamA)
+ assertThat(outputConfigAt1.streams).containsExactly(streamB)
+ assertThat(outputConfigAt2.streams).containsExactly(streamC)
}
@Test
fun testOutputSortingWithStreamUseHint() {
-
- val streamConfig =
- CameraStream.Config.create(
- listOf(
- OutputStream.Config.create(
- Size(800, 600), StreamFormat.UNKNOWN,
- streamUseCase = OutputStream.StreamUseCase.DEFAULT,
- streamUseHint = OutputStream.StreamUseHint.VIDEO_RECORD
- ),
- OutputStream.Config.create(
- Size(1600, 1200), StreamFormat.UNKNOWN,
- streamUseCase = OutputStream.StreamUseCase.PREVIEW
- ),
- OutputStream.Config.create(
- Size(800, 600), StreamFormat.UNKNOWN,
- streamUseCase = OutputStream.StreamUseCase.STILL_CAPTURE
- ),
- )
- )
+ val streamConfigA = CameraStream.Config.create(
+ Size(800, 600),
+ StreamFormat.UNKNOWN,
+ streamUseCase = OutputStream.StreamUseCase.DEFAULT,
+ streamUseHint = OutputStream.StreamUseHint.VIDEO_RECORD
+ )
+ val streamConfigB = CameraStream.Config.create(
+ Size(1600, 1200),
+ StreamFormat.UNKNOWN,
+ streamUseCase = OutputStream.StreamUseCase.VIDEO_CALL
+ )
+ val streamConfigC = CameraStream.Config.create(
+ Size(800, 600),
+ StreamFormat.UNKNOWN,
+ streamUseCase = OutputStream.StreamUseCase.STILL_CAPTURE
+ )
val graphConfig =
CameraGraph.Config(
camera = CameraId("0"),
- streams = listOf(streamConfig),
+ streams = listOf(
+ streamConfigA,
+ streamConfigB,
+ streamConfigC
+ ),
)
+
val streamGraph = StreamGraphImpl(config.fakeMetadata, graphConfig)
- val stream1 = streamGraph.outputs[0]
- assertThat(stream1.streamUseCase).isEqualTo(OutputStream.StreamUseCase.PREVIEW)
+ // Get the stream for each streamConfig
+ val streamA = streamGraph[streamConfigA]
+ val streamB = streamGraph[streamConfigB]
+ val streamC = streamGraph[streamConfigC]
- val stream2 = streamGraph.outputs[1]
- assertThat(stream2.streamUseCase).isEqualTo(OutputStream.StreamUseCase.STILL_CAPTURE)
+ // Read the list of outputConfigs (in order)
+ val outputConfigAt0 = streamGraph.outputConfigs[0]
+ val outputConfigAt1 = streamGraph.outputConfigs[1]
+ val outputConfigAt2 = streamGraph.outputConfigs[2]
- val stream3 = streamGraph.outputs[2]
- assertThat(stream3.streamUseCase).isEqualTo(OutputStream.StreamUseCase.DEFAULT)
+ // Assert that the outputConfig order is B, C, A because A is moved to the bottom of the
+ // list due to StreamUseHint.VIDEO_RECORD
+ assertThat(outputConfigAt0.streams).containsExactly(streamB)
+ assertThat(outputConfigAt1.streams).containsExactly(streamC)
+ assertThat(outputConfigAt2.streams).containsExactly(streamA)
}
@Test
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/CameraQuirks.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/CameraQuirks.java
index efffb01..a8531a4 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/CameraQuirks.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/CameraQuirks.java
@@ -58,6 +58,9 @@
if (JpegHalCorruptImageQuirk.load(cameraCharacteristicsCompat)) {
quirks.add(new JpegHalCorruptImageQuirk());
}
+ if (JpegCaptureDownsizingQuirk.load(cameraCharacteristicsCompat)) {
+ quirks.add(new JpegCaptureDownsizingQuirk());
+ }
if (CamcorderProfileResolutionQuirk.load(cameraCharacteristicsCompat)) {
quirks.add(new CamcorderProfileResolutionQuirk(cameraCharacteristicsCompat));
}
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/JpegCaptureDownsizingQuirk.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/JpegCaptureDownsizingQuirk.java
new file mode 100644
index 0000000..45373a73
--- /dev/null
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/JpegCaptureDownsizingQuirk.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.camera2.internal.compat.quirk;
+
+import static android.hardware.camera2.CameraMetadata.LENS_FACING_FRONT;
+
+import android.hardware.camera2.CameraCharacteristics;
+import android.os.Build;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat;
+import androidx.camera.core.internal.compat.quirk.SoftwareJpegEncodingPreferredQuirk;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Locale;
+import java.util.Set;
+
+/**
+ * Quirk which denotes single capture with JPEG format may have an output buffer smaller than the
+ * expected size.
+ *
+ * <p>QuirkSummary
+ * Bug Id: 315071023
+ * Description: Addresses a potential issue where JPEG photo captures may result in
+ * smaller-than-expected output resolutions. In certain cases, even when configuring the
+ * maximum supported JPEG output size using
+ * {@link android.hardware.camera2.CameraCharacteristics#SCALER_STREAM_CONFIGURATION_MAP},
+ * the captured ImageProxy may contain a photo buffer with a smaller resolution. This can
+ * lead to unexpected cropping or transformation issues during post-capture processing.
+ * Device(s): Redmi note 8 pro - front camera
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public class JpegCaptureDownsizingQuirk implements SoftwareJpegEncodingPreferredQuirk {
+
+ private static final Set<String> KNOWN_AFFECTED_FRONT_CAMERA_DEVICES = new HashSet<>(
+ Arrays.asList(
+ "redmi note 8 pro"
+ ));
+
+ static boolean load(@NonNull CameraCharacteristicsCompat characteristicsCompat) {
+ return KNOWN_AFFECTED_FRONT_CAMERA_DEVICES.contains(Build.MODEL.toLowerCase(Locale.US))
+ && characteristicsCompat.get(CameraCharacteristics.LENS_FACING)
+ == LENS_FACING_FRONT;
+ }
+}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/streamsharing/ResolutionsMerger.java b/camera/camera-core/src/main/java/androidx/camera/core/streamsharing/ResolutionsMerger.java
index 3ce389e..5165c31 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/streamsharing/ResolutionsMerger.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/streamsharing/ResolutionsMerger.java
@@ -50,6 +50,7 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
+import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -68,6 +69,8 @@
private static final double SAME_AREA_WIDTH_HEIGHT_RATIO = sqrt(4.0 / 3.0 * 16.0 / 9.0);
@NonNull
+ private final Size mSensorSize;
+ @NonNull
private final Rational mSensorAspectRatio;
@NonNull
private final Rational mFallbackAspectRatio;
@@ -96,6 +99,7 @@
ResolutionsMerger(@NonNull Size sensorSize, @NonNull Set<UseCaseConfig<?>> childrenConfigs,
@NonNull SupportedOutputSizesSorter supportedOutputSizesSorter,
@NonNull List<Size> cameraSupportedResolutions) {
+ mSensorSize = sensorSize;
mSensorAspectRatio = getSensorAspectRatio(sensorSize);
mFallbackAspectRatio = getFallbackAspectRatio(mSensorAspectRatio);
mChildrenConfigs = childrenConfigs;
@@ -121,7 +125,7 @@
candidateSizes = getSupportedPrivResolutions(parentSupportedSizesMap);
}
- return mergeChildrenResolutions(candidateSizes);
+ return selectParentResolutions(candidateSizes);
}
/**
@@ -192,8 +196,9 @@
* Returns the preferred child size with considering parent size and child's configuration.
*
* <p>Returns the first size in the child's ordered size list that can be cropped from {@code
- * parentSize} without upscaling it and causing double-cropping, or {@code parentSize} if no
- * matching is found.
+ * parentSize} without upscaling it, or {@code parentSize} if no matching is found.
+ *
+ * <p>The child size not causing double-cropping will be selected in priority.
*
* <p>Notes that the input {@code childConfig} is expected to be one of the values that use to
* construct the {@link ResolutionsMerger}, if not an IllegalArgumentException will be thrown.
@@ -201,17 +206,11 @@
@VisibleForTesting
@NonNull
Size getPreferredChildSize(@NonNull Size parentSize, @NonNull UseCaseConfig<?> childConfig) {
- boolean isSourceCropped = !isSensorAspectRatio(parentSize);
-
+ // Select the first child resolution that does not result in double-cropping and upscaling.
List<Size> candidateChildSizes = getSortedChildSizes(childConfig);
for (Size childSize : candidateChildSizes) {
- // Skip child sizes that need another cropping when source is already cropped.
- if (isSourceCropped) {
- boolean needAnotherCropping = !(isFallbackAspectRatio(parentSize)
- && isFallbackAspectRatio(childSize));
- if (needAnotherCropping) {
- continue;
- }
+ if (isDoubleCropping(parentSize, childSize)) {
+ continue;
}
if (!hasUpscaling(childSize, parentSize)) {
@@ -219,6 +218,16 @@
}
}
+ // Select the first child resolution that does not result in upscaling (might have
+ // smaller FOV due to double-cropping). This may occur when selecting parent resolutions
+ // that are expected to result in double-clipping in order to reduce binding failures in
+ // edge cases.
+ for (Size childSize : candidateChildSizes) {
+ if (!hasUpscaling(childSize, parentSize)) {
+ return childSize;
+ }
+ }
+
return parentSize;
}
@@ -251,40 +260,52 @@
}
@NonNull
- private List<Size> mergeChildrenResolutions(@NonNull List<Size> candidateParentResolutions) {
+ private List<Size> selectParentResolutions(@NonNull List<Size> candidateParentResolutions) {
// The following sequence of parent resolution selection is used to prevent double-cropping
// from happening:
- // 1. Add sensor aspect-ratio resolutions, which will not cause double-cropping when the
- // child resolution is in any aspect-ratio. This is to provide parent resolution that can
- // be accepted by children in general cases.
- // 2. Add fallback aspect-ratio resolutions, which will not cause double-cropping only when
- // the child resolution is in fallback aspect-ratio.
+ // 1. Add sensor aspect-ratio resolutions, which do not result in double-cropping with any
+ // aspect-ratio of child resolution. This is to provide parent resolution that can be
+ // accepted by children in general cases.
+ // 2. Add fallback aspect-ratio (the one between 4:3 and 16:9 that is not sensor
+ // aspect-ratio) resolutions, that can crop/downscale to at least one child size for
+ // each child.
+ // 3. Add other aspect-ratio resolutions, that can crop/downscale to at least one child
+ // size for each child.
+ // The parent sizes added in step 2 and step 3 will only be used to crop to child sizes
+ // that do not result in double-cropping. For example, if childRatio < parentRatio <
+ // sensorRatio or childRatio > parentRatio > sensorRatio, then there is no double-cropping.
List<Size> result = new ArrayList<>();
// Add resolutions for sensor aspect-ratio.
if (needToAddSensorResolutions()) {
- result.addAll(mergeChildrenResolutionsByAspectRatio(mSensorAspectRatio,
- candidateParentResolutions));
+ result.addAll(selectParentResolutionsByAspectRatio(mSensorAspectRatio,
+ candidateParentResolutions, false));
}
- // Add resolutions for fallback aspect-ratio if needed.
- if (needToAddFallbackResolutions()) {
- result.addAll(mergeChildrenResolutionsByAspectRatio(mFallbackAspectRatio,
- candidateParentResolutions));
- }
+ // Add resolutions for fallback aspect-ratio.
+ result.addAll(selectParentResolutionsByAspectRatio(mFallbackAspectRatio,
+ candidateParentResolutions, false));
- // TODO(b/315098647): When the resulting parent resolution list is empty, consider adding
- // resolutions that are neither 4:3 nor 16:9, but have a high overlap area (e.g. 80%)
- // compared to the sensor size, which do not cause severe reduction of FOV, to prevent
- // binding failures in some edge cases.
+ // Add other aspect-ratio resolutions. Resolutions with larger FOV will be added first.
+ result.addAll(selectOtherAspectRatioParentResolutionsWithFovPriority(
+ candidateParentResolutions, false));
+
+ if (result.isEmpty()) {
+ // When the resulting parent resolution list is empty (this may be due to the camera
+ // not supporting 4:3 and 16:9 resolutions or a strict ResolutionSelector settings),
+ // add resolutions that are neither 4:3 nor 16:9 to prevent binding failures.
+ // Resolutions with larger FOV will be added first.
+ result.addAll(selectOtherAspectRatioParentResolutionsWithFovPriority(
+ candidateParentResolutions, true));
+ }
Logger.d(TAG, "Parent resolutions: " + result);
return result;
}
- private List<Size> mergeChildrenResolutionsByAspectRatio(@NonNull Rational aspectRatio,
- @NonNull List<Size> candidateParentResolutions) {
+ private List<Size> selectParentResolutionsByAspectRatio(@NonNull Rational aspectRatio,
+ @NonNull List<Size> candidateParentResolutions, boolean allowDoubleCropping) {
List<Size> candidates = filterResolutionsByAspectRatio(aspectRatio,
candidateParentResolutions);
sortInDescendingOrder(candidates);
@@ -293,9 +314,12 @@
Set<Size> sizesTooLarge = new HashSet<>(candidates);
for (UseCaseConfig<?> childConfig : mChildrenConfigs) {
List<Size> childSizes = getSortedChildSizes(childConfig);
+ if (!allowDoubleCropping) {
+ childSizes = filterOutChildSizesCausingDoubleCropping(aspectRatio, childSizes);
+ }
if (childSizes.isEmpty()) {
- // When the list is empty, which means no child required resolutions are supported,
- // make the parent list to be empty to reflect this.
+ // When the list is empty, which means no child sizes match requirement, make the
+ // parent list to be empty to reflect this.
return new ArrayList<>();
}
@@ -313,6 +337,66 @@
return result;
}
+ @NonNull
+ private List<Size> selectOtherAspectRatioParentResolutionsWithFovPriority(
+ @NonNull List<Size> candidates, boolean allowDoubleCropping) {
+ Map<Rational, List<Size>> ratioToSizesMap = groupSizesByAspectRatio(candidates);
+
+ // Get aspect-ratio of candidate parent sizes and sort by overlapping area (FOV) in
+ // descending order.
+ List<Rational> ratios = new ArrayList<>(ratioToSizesMap.keySet());
+ sortByFov(ratios);
+
+ // Add resolutions that are neither 4:3 nor 16:9. Resolutions with larger FOV will be
+ // added first.
+ List<Size> result = new ArrayList<>();
+ for (Rational ratio: ratios) {
+ if (ratio.equals(ASPECT_RATIO_16_9) || ratio.equals(ASPECT_RATIO_4_3)) {
+ continue;
+ }
+
+ List<Size> sizes = Objects.requireNonNull(ratioToSizesMap.get(ratio));
+ result.addAll(selectParentResolutionsByAspectRatio(ratio, sizes, allowDoubleCropping));
+ }
+
+ return result;
+ }
+
+ @NonNull
+ private Map<Rational, List<Size>> groupSizesByAspectRatio(@NonNull List<Size> sizes) {
+ Map<Rational, List<Size>> result = new HashMap<>();
+
+ // Add 4:3 and 16:9 first so that other mod-16 sizes won't introduce additional keys.
+ result.put(ASPECT_RATIO_4_3, new ArrayList<>());
+ result.put(ASPECT_RATIO_16_9, new ArrayList<>());
+
+ // Group sizes by aspect-ratio with mod-16 considered.
+ for (Size size : sizes) {
+ if (size.getHeight() <= 0) {
+ continue;
+ }
+
+ // Get the aspect-ratio group if it is ready existed.
+ List<Size> group = null;
+ for (Rational ratio : result.keySet()) {
+ if (hasMatchingAspectRatio(size, ratio)) {
+ group = result.get(ratio);
+ break;
+ }
+ }
+
+ // Create a new aspect-ratio group if it is not existed.
+ if (group == null) {
+ group = new ArrayList<>();
+ result.put(toRational(size), group);
+ }
+
+ Objects.requireNonNull(group).add(size);
+ }
+
+ return result;
+ }
+
/**
* Gets child sizes sorted by {@link SupportedOutputSizesSorter}.
*
@@ -347,16 +431,6 @@
return false;
}
- private boolean needToAddFallbackResolutions() {
- // Need to add fallback resolutions if any required resolution is fallback aspect-ratio.
- for (Size size : getChildrenRequiredResolutions()) {
- if (hasMatchingAspectRatio(size, mFallbackAspectRatio)) {
- return true;
- }
- }
- return false;
- }
-
@NonNull
private Set<Size> getChildrenRequiredResolutions() {
Set<Size> result = new HashSet<>();
@@ -368,12 +442,64 @@
return result;
}
- private boolean isSensorAspectRatio(@NonNull Size size) {
- return hasMatchingAspectRatio(size, mSensorAspectRatio);
+ @NonNull
+ private List<Size> filterOutChildSizesCausingDoubleCropping(@NonNull Rational parentAspectRatio,
+ @NonNull List<Size> childSizes) {
+ List<Size> result = new ArrayList<>();
+ for (Size childSize: childSizes) {
+ if (!isDoubleCropping(parentAspectRatio, childSize)) {
+ result.add(childSize);
+ }
+ }
+
+ return result;
}
- private boolean isFallbackAspectRatio(@NonNull Size size) {
- return hasMatchingAspectRatio(size, mFallbackAspectRatio);
+ private boolean isDoubleCropping(@NonNull Rational parentRatio, @NonNull Size childSize) {
+ // No double cropping results when the sensor and parent have the same aspect ratio or
+ // when the parent and child have the same aspect ratio.
+ if (mSensorAspectRatio.equals(parentRatio) || hasMatchingAspectRatio(childSize,
+ parentRatio)) {
+ return false;
+ }
+
+ // When the cropping from sensor to parent and from parent to child are in the same
+ // direction, there is no double-cropping.
+ return areCroppingInDifferentDirection(
+ mSensorAspectRatio.floatValue(),
+ parentRatio.floatValue(),
+ toRational(childSize).floatValue()
+ );
+ }
+
+ private boolean isDoubleCropping(@NonNull Size parentSize, @NonNull Size childSize) {
+ return isDoubleCropping(toRational(parentSize), childSize);
+ }
+
+ private boolean areCroppingInDifferentDirection(float sensorRatioValue, float parentRatioValue,
+ float childRatioValue) {
+ // There is only one cropping direction When the sensor and parent have the same
+ // aspect-ratio or when the parent and child have the same aspect-ratio.
+ if (sensorRatioValue == parentRatioValue || parentRatioValue == childRatioValue) {
+ return false;
+ }
+
+ // When childRatio < parentRatio < sensorRatio or childRatio > parentRatio > sensorRatio,
+ // the cropping from sensor to parent and from parent to child are in the same direction.
+ if (sensorRatioValue > parentRatioValue) {
+ return parentRatioValue < childRatioValue;
+ } else {
+ return parentRatioValue > childRatioValue;
+ }
+ }
+
+ /**
+ * Sorts the input aspect-ratio by overlapping area with sensor (FOV) in descending order.
+ */
+ private void sortByFov(@NonNull List<Rational> ratios) {
+ Rational actualSensorAspectRatio = toRational(mSensorSize);
+ Collections.sort(ratios, new CompareAspectRatioByOverlappingAreaToReference(
+ actualSensorAspectRatio, true));
}
/**
@@ -383,7 +509,7 @@
@NonNull
static Rect getCropRectOfReferenceAspectRatio(@NonNull Size targetSize,
@NonNull Size referenceSize) {
- Rational referenceRatio = new Rational(referenceSize.getWidth(), referenceSize.getHeight());
+ Rational referenceRatio = toRational(referenceSize);
return getCenterCroppedRectangle(referenceRatio, targetSize);
}
@@ -438,7 +564,7 @@
@NonNull Size baseSize) {
int width = baseSize.getWidth();
int height = baseSize.getHeight();
- Rational referenceRatio = new Rational(width, height);
+ Rational referenceRatio = toRational(baseSize);
RectF cropRectInFloat;
if (cropRatio.floatValue() == referenceRatio.floatValue()) {
@@ -593,4 +719,53 @@
return childSize.getHeight() > parentSize.getHeight()
|| childSize.getWidth() > parentSize.getWidth();
}
+
+ @NonNull
+ private static Rational toRational(@NonNull Size size) {
+ // For 4:3 and 16:9, use hasMatchingAspectRatio to take "mod 16 calculation" into
+ // consideration. For example, a standard 16:9 supported size is 1920x1080. It may become
+ // 1920x1088 on some devices because 1088 is multiple of 16.
+ if (hasMatchingAspectRatio(size, ASPECT_RATIO_4_3)) {
+ return ASPECT_RATIO_4_3;
+ } else if (hasMatchingAspectRatio(size, ASPECT_RATIO_16_9)) {
+ return ASPECT_RATIO_16_9;
+ } else {
+ return new Rational(size.getWidth(), size.getHeight());
+ }
+ }
+
+ private static float computeAreaOverlapping(@NonNull Rational croppingRatio,
+ @NonNull Rational baseRatio) {
+ float croppingRatioValue = croppingRatio.floatValue();
+ float baseRatioValue = baseRatio.floatValue();
+
+ return (croppingRatioValue > baseRatioValue) ? baseRatioValue / croppingRatioValue
+ : croppingRatioValue / baseRatioValue;
+ }
+
+ private static class CompareAspectRatioByOverlappingAreaToReference implements
+ Comparator<Rational> {
+ @NonNull
+ private final Rational mReferenceAspectRatio;
+ private final boolean mReverse;
+
+ /** Creates a comparator which can reverse the total ordering. */
+ CompareAspectRatioByOverlappingAreaToReference(@NonNull Rational referenceAspectRatio,
+ boolean reverse) {
+ mReferenceAspectRatio = referenceAspectRatio;
+ mReverse = reverse;
+ }
+
+ @Override
+ public int compare(@NonNull Rational lhs, @NonNull Rational rhs) {
+ float lhsOverlapping = computeAreaOverlapping(lhs, mReferenceAspectRatio);
+ float rhsOverlapping = computeAreaOverlapping(rhs, mReferenceAspectRatio);
+
+ if (mReverse) {
+ return Float.compare(rhsOverlapping, lhsOverlapping);
+ } else {
+ return Float.compare(lhsOverlapping, rhsOverlapping);
+ }
+ }
+ }
}
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/streamsharing/ResolutionsMergerTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/streamsharing/ResolutionsMergerTest.kt
index c4794b6..dde7b9e 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/streamsharing/ResolutionsMergerTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/streamsharing/ResolutionsMergerTest.kt
@@ -81,8 +81,8 @@
val config1 = createUseCaseConfig()
val config2 = createUseCaseConfig()
val childConfigs = setOf(config1, config2)
- val candidateChildSizes1 = listOf(SIZE_1920_1080, SIZE_1280_720) // 16:9
- val candidateChildSizes2 = listOf(SIZE_1280_960, SIZE_960_720, SIZE_640_480) // 4:3
+ val candidateChildSizes1 = listOf(SIZE_1920_1080, SIZE_1280_720, SIZE_640_480) // 16:9, 4:3
+ val candidateChildSizes2 = listOf(SIZE_1280_960, SIZE_960_720, SIZE_1280_720) // 4:3, 16:9
val sorter = FakeSupportedOutputSizesSorter(
mapOf(
config1 to candidateChildSizes1,
@@ -91,12 +91,12 @@
)
val merger = ResolutionsMerger(sensorSize, childConfigs, sorter, CAMERA_SUPPORTED_SIZES)
- // Act & Assert, should returns a list that concatenates 4:3 resolutions before 16:9
- // resolutions and removes resolutions that are too large (no need for multiple resolutions
- // that can be cropped to all child sizes) and too small (causing upscaling).
+ // Act & Assert, should returns a list that concatenates sensor (4:3) resolutions before
+ // 16:9 resolutions and removes resolutions that are too large (no need for multiple
+ // resolutions that can be cropped to all child sizes) and too small (causing upscaling).
val parentConfig = MutableOptionsBundle.create()
assertThat(merger.getMergedResolutions(parentConfig)).containsExactly(
- SIZE_1920_1440, SIZE_1280_960, SIZE_1920_1080, SIZE_1280_720
+ SIZE_1920_1440, SIZE_1280_960, SIZE_960_720, SIZE_1920_1080, SIZE_1280_720
).inOrder()
}
@@ -150,6 +150,107 @@
).inOrder()
}
+ @Test
+ fun getMergedResolutions_whenDifferentChildRequiresDifferentAspectRatio_canReturnCorrectly() {
+ // Arrange.
+ val sensorSize = SIZE_3264_2448 // 4:3
+ val config1 = createUseCaseConfig()
+ val config2 = createUseCaseConfig()
+ val childConfigs = setOf(config1, config2)
+ val candidateChildSizes1 = listOf(SIZE_1920_1080, SIZE_1280_720) // 16:9
+ val candidateChildSizes2 = listOf(SIZE_1280_960, SIZE_960_720, SIZE_640_480) // 4:3
+ val sorter = FakeSupportedOutputSizesSorter(
+ mapOf(
+ config1 to candidateChildSizes1,
+ config2 to candidateChildSizes2
+ )
+ )
+ val merger = ResolutionsMerger(sensorSize, childConfigs, sorter, CAMERA_SUPPORTED_SIZES)
+
+ // Act & Assert, should returns a list of sensor (4:3) resolutions and removes resolutions
+ // that are too large and too small.
+ val parentConfig = MutableOptionsBundle.create()
+ assertThat(merger.getMergedResolutions(parentConfig)).containsExactly(
+ SIZE_1920_1440, SIZE_1280_960
+ ).inOrder()
+ }
+
+ @Test
+ fun getMergedResolutions_whenAllChildrenRequires720To480Resolution_canReturnCorrectly() {
+ // Arrange.
+ val sensorSize = SIZE_3264_2448 // 4:3
+ val config1 = createUseCaseConfig()
+ val config2 = createUseCaseConfig()
+ val childConfigs = setOf(config1, config2)
+ val candidateChildSizes1 = listOf(SIZE_2560_1920, SIZE_1920_1440, SIZE_720_480) // 4:3, 3:2
+ val candidateChildSizes2 = listOf(SIZE_1280_960, SIZE_960_720, SIZE_720_480) // 4:3, 3:2
+ val sorter = FakeSupportedOutputSizesSorter(
+ mapOf(
+ config1 to candidateChildSizes1,
+ config2 to candidateChildSizes2
+ )
+ )
+ val merger = ResolutionsMerger(sensorSize, childConfigs, sorter, CAMERA_SUPPORTED_SIZES)
+
+ // Act & Assert, should returns a list that concatenates 4:3 resolutions before 3:2
+ // resolutions and removes resolutions that are too large (no need for multiple resolutions
+ // that can be cropped to all child sizes) and too small (causing upscaling).
+ val parentConfig = MutableOptionsBundle.create()
+ assertThat(merger.getMergedResolutions(parentConfig)).containsExactly(
+ SIZE_2560_1920, SIZE_1920_1440, SIZE_1280_960, SIZE_960_720, SIZE_720_480
+ ).inOrder()
+ }
+
+ @Test
+ fun getMergedResolutions_whenOnlyOneChildRequires720To480Resolution_canReturnCorrectly() {
+ // Arrange.
+ val sensorSize = SIZE_3264_2448 // 4:3
+ val config1 = createUseCaseConfig()
+ val config2 = createUseCaseConfig()
+ val childConfigs = setOf(config1, config2)
+ val candidateChildSizes1 = listOf(SIZE_2560_1920, SIZE_1920_1440, SIZE_720_480) // 4:3, 3:2
+ val candidateChildSizes2 = listOf(SIZE_1280_960, SIZE_960_720, SIZE_192_108) // 4:3, 16:9
+ val sorter = FakeSupportedOutputSizesSorter(
+ mapOf(
+ config1 to candidateChildSizes1,
+ config2 to candidateChildSizes2
+ )
+ )
+ val merger = ResolutionsMerger(sensorSize, childConfigs, sorter, CAMERA_SUPPORTED_SIZES)
+
+ // Act & Assert, should returns a list that concatenates 4:3 resolutions before 3:2
+ // resolutions and removes resolutions that are too large and too small.
+ val parentConfig = MutableOptionsBundle.create()
+ assertThat(merger.getMergedResolutions(parentConfig)).containsExactly(
+ SIZE_2560_1920, SIZE_1920_1440, SIZE_1280_960, SIZE_960_720, SIZE_720_480
+ ).inOrder()
+ }
+
+ @Test
+ fun getMergedResolutions_whenNeither16To9Nor4To3AreSupported_canReturnCorrectly() {
+ // Arrange.
+ val sensorSize = SIZE_3840_2000 // near 2:1
+ val config1 = createUseCaseConfig()
+ val config2 = createUseCaseConfig()
+ val childConfigs = setOf(config1, config2)
+ val candidateChildSizes1 = listOf(SIZE_2560_1440, SIZE_1280_720) // 16:9
+ val candidateChildSizes2 = listOf(SIZE_1920_1080, SIZE_960_540) // 16:9
+ val sorter = FakeSupportedOutputSizesSorter(
+ mapOf(
+ config1 to candidateChildSizes1,
+ config2 to candidateChildSizes2
+ )
+ )
+ val merger = ResolutionsMerger(sensorSize, childConfigs, sorter, SIZES_OTHER_ASPECT_RATIO)
+
+ // Act & Assert, should returns a list of near 2:1 resolutions and removes resolutions that
+ // are too large and too small.
+ val parentConfig = MutableOptionsBundle.create()
+ assertThat(merger.getMergedResolutions(parentConfig)).containsExactly(
+ SIZE_3840_2000, SIZE_3840_1920, SIZE_2560_1280, SIZE_1440_720
+ ).inOrder()
+ }
+
@Test(expected = IllegalArgumentException::class)
fun getPreferredChildSizePair_whenConfigNotPassedToConstructor_throwsException() {
// Arrange.
@@ -287,7 +388,9 @@
SIZE_960_720,
// 16:9
SIZE_1920_1080,
- SIZE_960_540
+ SIZE_960_540,
+ // 3:2
+ SIZE_720_480
)
val sorter = FakeSupportedOutputSizesSorter(mapOf(config to candidateChildSizes))
val merger = ResolutionsMerger(SENSOR_SIZE, setOf(config), sorter, CAMERA_SUPPORTED_SIZES)
@@ -296,6 +399,7 @@
// double-cropping.
assertThat(merger.getPreferredChildSize(SIZE_2560_1440, config)).isEqualTo(SIZE_1920_1080)
assertThat(merger.getPreferredChildSize(SIZE_1280_720, config)).isEqualTo(SIZE_960_540)
+ assertThat(merger.getPreferredChildSize(SIZE_720_480, config)).isEqualTo(SIZE_720_480)
// Act & Assert, should returns parent size when no matching.
assertThat(merger.getPreferredChildSize(SIZE_192_108, config)).isEqualTo(SIZE_192_108)
@@ -624,15 +728,23 @@
SIZE_192_108
)
// Other aspect-ratio resolutions.
+ private val SIZE_3840_2000 = Size(3840, 2000)
+ private val SIZE_3840_1920 = Size(3840, 1920)
+ private val SIZE_2560_1280 = Size(2560, 1280)
private val SIZE_1440_720 = Size(1440, 720)
private val SIZE_800_800 = Size(800, 800)
private val SIZE_720_720 = Size(720, 720)
+ private val SIZE_720_480 = Size(720, 480)
private val SIZE_500_400 = Size(500, 400)
private val SIZE_176_144 = Size(176, 144)
private val SIZES_OTHER_ASPECT_RATIO = listOf(
+ SIZE_3840_2000,
+ SIZE_3840_1920,
+ SIZE_2560_1280,
SIZE_1440_720,
SIZE_800_800,
SIZE_720_720,
+ SIZE_720_480,
SIZE_500_400,
SIZE_176_144
)
diff --git a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageCaptureBaseTest.kt b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageCaptureBaseTest.kt
index d849cea3..14fdc2f 100644
--- a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageCaptureBaseTest.kt
+++ b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageCaptureBaseTest.kt
@@ -185,9 +185,13 @@
"The captured image rotation degrees [$imageRotationDegrees] was expected to be " +
"equal to [$sensorToTargetRotation], or the captured image's resolution " +
"[$imageSize] was expected to be equal to [$expectedResolution]"
- )
- .that(areRotationsEqual || areResolutionsEqual)
- .isTrue()
+ ).that(areRotationsEqual || areResolutionsEqual).isTrue()
+
+ assertWithMessage(
+ "The captured image's resolution " +
+ "[$imageSize] was expected to be equal to [$expectedResolution]"
+ ).that(expectedResolution.height * expectedResolution.width)
+ .isEqualTo(imageSize!!.height * imageSize.width)
// Delete captured image
scenario.withActivity { mCaptureResult?.delete() ?: Unit }
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-eu/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-eu/strings.xml
index 651b4e3..bcac7d9 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-eu/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-eu/strings.xml
@@ -176,7 +176,7 @@
<string name="nav_map_template_demo_title" msgid="344985380763975398">"Nabigazioaren txantiloien (mapa soilik dutenak) demo-bertsioa"</string>
<string name="nav_demos_title" msgid="72781206086461004">"Nabigazioaren demo-bertsioak"</string>
<string name="navigation_alert_title" msgid="8306554249264200848">"Radar mugikorrak al daude oraindik?"</string>
- <string name="navigation_alert_subtitle" msgid="3331130131492672264">"Duela 10 min jakinarazi da"</string>
+ <string name="navigation_alert_subtitle" msgid="3331130131492672264">"Duela 10 minutu jakinarazi da"</string>
<string name="no_toll_card_permission" msgid="6789073114449712090">"Ez dago bidesarien txartela atzitzeko baimenik."</string>
<string name="no_energy_level_permission" msgid="1684773185095107825">"Ez dago energia-maila atzitzeko baimenik."</string>
<string name="no_speed_permission" msgid="5812532480922675390">"Ez dago abiadura atzitzeko baimenik."</string>
diff --git a/collection/collection/src/jvmMain/kotlin/androidx/collection/ArrayMap.kt b/collection/collection/src/jvmMain/kotlin/androidx/collection/ArrayMap.jvm.kt
similarity index 96%
rename from collection/collection/src/jvmMain/kotlin/androidx/collection/ArrayMap.kt
rename to collection/collection/src/jvmMain/kotlin/androidx/collection/ArrayMap.jvm.kt
index 3e4c81a..ff01e47 100644
--- a/collection/collection/src/jvmMain/kotlin/androidx/collection/ArrayMap.kt
+++ b/collection/collection/src/jvmMain/kotlin/androidx/collection/ArrayMap.jvm.kt
@@ -14,6 +14,7 @@
* limitations under the License.
*/
+@file:JvmName("ArrayMapKt") // Workaround for b/313964643.
@file:Suppress("NOTHING_TO_INLINE") // Aliases to public API.
package androidx.collection
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/RememberIntrinsicTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/RememberIntrinsicTransformTests.kt
index 9aec5bf..9675502 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/RememberIntrinsicTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/RememberIntrinsicTransformTests.kt
@@ -844,4 +844,23 @@
}
""",
)
+
+ @Test
+ fun testRememberWithDefaultParams() = verifyGoldenComposeIrTransform(
+ extra = """
+ import androidx.compose.runtime.*
+
+ val LocalColor = compositionLocalOf { 0 }
+ """,
+ source = """
+ import androidx.compose.runtime.*
+
+ @Composable fun Icon(
+ param: Int,
+ defaultParam: Int = LocalColor.current
+ ) {
+ val remembered = remember(param, defaultParam) { TODO() }
+ }
+ """
+ )
}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberAfterNonStaticDefaultParameters\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberAfterNonStaticDefaultParameters\133useFir = false\135.txt"
index 42bf590..f23cfaa 100644
--- "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberAfterNonStaticDefaultParameters\133useFir = false\135.txt"
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberAfterNonStaticDefaultParameters\133useFir = false\135.txt"
@@ -60,7 +60,7 @@
val s = <block>{
%composer.startReplaceableGroup(<>)
sourceInformation(%composer, "CC(remember):Test.kt#9igjgp")
- val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100 or %dirty and 0b01110000 == 0b00100000 or %dirty and 0b001110000000 == 0b000100000000) {
+ val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100 or %dirty and 0b01110000 == 0b00100000 or %dirty and 0b001110000000 xor 0b000110000000 > 256 && %composer.changed(c) || %dirty and 0b000110000000 == 0b000100000000) {
Any()
}
%composer.endReplaceableGroup()
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberAfterNonStaticDefaultParameters\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberAfterNonStaticDefaultParameters\133useFir = true\135.txt"
index 42bf590..f23cfaa 100644
--- "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberAfterNonStaticDefaultParameters\133useFir = true\135.txt"
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTests/testRememberAfterNonStaticDefaultParameters\133useFir = true\135.txt"
@@ -60,7 +60,7 @@
val s = <block>{
%composer.startReplaceableGroup(<>)
sourceInformation(%composer, "CC(remember):Test.kt#9igjgp")
- val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100 or %dirty and 0b01110000 == 0b00100000 or %dirty and 0b001110000000 == 0b000100000000) {
+ val tmp0_group = %composer.cache(%dirty and 0b1110 == 0b0100 or %dirty and 0b01110000 == 0b00100000 or %dirty and 0b001110000000 xor 0b000110000000 > 256 && %composer.changed(c) || %dirty and 0b000110000000 == 0b000100000000) {
Any()
}
%composer.endReplaceableGroup()
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTestsStrongSkipping/testRememberWithDefaultParams\133useFir = false\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTestsStrongSkipping/testRememberWithDefaultParams\133useFir = false\135.txt"
new file mode 100644
index 0000000..760d0e4
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTestsStrongSkipping/testRememberWithDefaultParams\133useFir = false\135.txt"
@@ -0,0 +1,65 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable fun Icon(
+ param: Int,
+ defaultParam: Int = LocalColor.current
+) {
+ val remembered = remember(param, defaultParam) { TODO() }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Icon(param: Int, defaultParam: Int, %composer: Composer?, %changed: Int, %default: Int) {
+ %composer = %composer.startRestartGroup(<>)
+ sourceInformation(%composer, "C(Icon)P(1)<curren...>,<rememb...>:Test.kt")
+ val %dirty = %changed
+ if (%default and 0b0001 != 0) {
+ %dirty = %dirty or 0b0110
+ } else if (%changed and 0b0110 == 0) {
+ %dirty = %dirty or if (%composer.changed(param)) 0b0100 else 0b0010
+ }
+ if (%changed and 0b00110000 == 0) {
+ %dirty = %dirty or if (%default and 0b0010 == 0 && %composer.changed(defaultParam)) 0b00100000 else 0b00010000
+ }
+ if (%dirty and 0b00010011 != 0b00010010 || !%composer.skipping) {
+ %composer.startDefaults()
+ if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+ if (%default and 0b0010 != 0) {
+ defaultParam = LocalColor.<get-current>(%composer, 0b0110)
+ %dirty = %dirty and 0b01110000.inv()
+ }
+ } else {
+ %composer.skipToGroupEnd()
+ if (%default and 0b0010 != 0) {
+ %dirty = %dirty and 0b01110000.inv()
+ }
+ }
+ %composer.endDefaults()
+ if (isTraceInProgress()) {
+ traceEventStart(<>, %dirty, -1, <>)
+ }
+ val remembered = <block>{
+ %composer.startReplaceableGroup(<>)
+ sourceInformation(%composer, "CC(remember):Test.kt#9igjgp")
+ %composer.cache(%dirty and 0b1110 == 0b0100 or %dirty and 0b01110000 xor 0b00110000 > 32 && %composer.changed(defaultParam) || %dirty and 0b00110000 == 0b00100000) {
+ TODO()
+ }
+ %composer.endReplaceableGroup()
+ }
+ if (isTraceInProgress()) {
+ traceEventEnd()
+ }
+ } else {
+ %composer.skipToGroupEnd()
+ }
+ %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+ Icon(param, defaultParam, %composer, updateChangedFlags(%changed or 0b0001), %default)
+ }
+}
diff --git "a/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTestsStrongSkipping/testRememberWithDefaultParams\133useFir = true\135.txt" "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTestsStrongSkipping/testRememberWithDefaultParams\133useFir = true\135.txt"
new file mode 100644
index 0000000..760d0e4
--- /dev/null
+++ "b/compose/compiler/compiler-hosted/integration-tests/src/test/resources/golden/androidx.compose.compiler.plugins.kotlin.RememberIntrinsicTransformTestsStrongSkipping/testRememberWithDefaultParams\133useFir = true\135.txt"
@@ -0,0 +1,65 @@
+//
+// Source
+// ------------------------------------------
+
+import androidx.compose.runtime.*
+
+@Composable fun Icon(
+ param: Int,
+ defaultParam: Int = LocalColor.current
+) {
+ val remembered = remember(param, defaultParam) { TODO() }
+}
+
+//
+// Transformed IR
+// ------------------------------------------
+
+@Composable
+fun Icon(param: Int, defaultParam: Int, %composer: Composer?, %changed: Int, %default: Int) {
+ %composer = %composer.startRestartGroup(<>)
+ sourceInformation(%composer, "C(Icon)P(1)<curren...>,<rememb...>:Test.kt")
+ val %dirty = %changed
+ if (%default and 0b0001 != 0) {
+ %dirty = %dirty or 0b0110
+ } else if (%changed and 0b0110 == 0) {
+ %dirty = %dirty or if (%composer.changed(param)) 0b0100 else 0b0010
+ }
+ if (%changed and 0b00110000 == 0) {
+ %dirty = %dirty or if (%default and 0b0010 == 0 && %composer.changed(defaultParam)) 0b00100000 else 0b00010000
+ }
+ if (%dirty and 0b00010011 != 0b00010010 || !%composer.skipping) {
+ %composer.startDefaults()
+ if (%changed and 0b0001 == 0 || %composer.defaultsInvalid) {
+ if (%default and 0b0010 != 0) {
+ defaultParam = LocalColor.<get-current>(%composer, 0b0110)
+ %dirty = %dirty and 0b01110000.inv()
+ }
+ } else {
+ %composer.skipToGroupEnd()
+ if (%default and 0b0010 != 0) {
+ %dirty = %dirty and 0b01110000.inv()
+ }
+ }
+ %composer.endDefaults()
+ if (isTraceInProgress()) {
+ traceEventStart(<>, %dirty, -1, <>)
+ }
+ val remembered = <block>{
+ %composer.startReplaceableGroup(<>)
+ sourceInformation(%composer, "CC(remember):Test.kt#9igjgp")
+ %composer.cache(%dirty and 0b1110 == 0b0100 or %dirty and 0b01110000 xor 0b00110000 > 32 && %composer.changed(defaultParam) || %dirty and 0b00110000 == 0b00100000) {
+ TODO()
+ }
+ %composer.endReplaceableGroup()
+ }
+ if (isTraceInProgress()) {
+ traceEventEnd()
+ }
+ } else {
+ %composer.skipToGroupEnd()
+ }
+ %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+ Icon(param, defaultParam, %composer, updateChangedFlags(%changed or 0b0001), %default)
+ }
+}
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt
index c846f55..a8ae26e 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt
@@ -993,7 +993,7 @@
}
}
}
- irIntrinsicRememberInvalid(isMemoizedLambda, args, metas, ::irInferredChanged)
+ irIntrinsicRememberInvalid(isMemoizedLambda, args, metas, ::irIntrinsicChanged)
}
if (canSkipExecution) {
@@ -1159,7 +1159,7 @@
}
}
}
- irIntrinsicRememberInvalid(isMemoizedLambda, args, metas, ::irInferredChanged)
+ irIntrinsicRememberInvalid(isMemoizedLambda, args, metas, ::irIntrinsicChanged)
}
val transformedBody = if (canSkipExecution) {
@@ -2659,6 +2659,7 @@
var isCertain: Boolean = false,
var maskSlot: Int = -1,
var maskParam: IrChangedBitMaskValue? = null,
+ var hasNonStaticDefault: Boolean = false
)
private fun paramMetaOf(arg: IrExpression, isProvided: Boolean): ParamMeta {
@@ -3049,7 +3050,7 @@
if (usesDirty || !metaMaskConsistent) {
{ _, arg, _ -> irChanged(arg, compareInstanceForUnstableValues = isMemoizedLambda) }
} else {
- ::irInferredChanged
+ ::irIntrinsicChanged
}
// Hoist execution of input params outside of the remember group, similar to how it is
@@ -3149,7 +3150,7 @@
.reduceOrNull { acc, changed -> irBooleanOr(acc, changed) }
?: irConst(false)
- private fun irInferredChanged(
+ private fun irIntrinsicChanged(
isMemoizedLambda: Boolean,
arg: IrExpression,
meta: ParamMeta
@@ -3159,9 +3160,11 @@
meta.isStatic -> null
meta.isCertain &&
meta.stability.knownStable() &&
- param is IrChangedBitMaskVariable -> {
- // if it's a dirty flag, and the parameter is _guaranteed_ to be stable, then we
- // know that the value is now CERTAIN, thus we can avoid calling changed completely
+ param is IrChangedBitMaskVariable &&
+ !meta.hasNonStaticDefault -> {
+ // if it's a dirty flag, and the parameter doesn't have a default value and is _known_
+ // to be stable, then we know that the value is now CERTAIN, thus we can avoid
+ // calling changed completely
//
// invalid = invalid or (mask == different)
irEqual(
@@ -3171,10 +3174,11 @@
}
meta.isCertain &&
!meta.stability.knownUnstable() &&
- param is IrChangedBitMaskVariable -> {
- // if it's a dirty flag, and the parameter might be stable, then we only check
- // changed if the value is unstable, otherwise we can just check to see if the mask
- // is different
+ param is IrChangedBitMaskVariable &&
+ !meta.hasNonStaticDefault -> {
+ // if it's a dirty flag, and the parameter doesn't have a default value and it might
+ // be stable, then we only check changed if the value is unstable, otherwise we can
+ // just check to see if the mask is different
//
// invalid = invalid or (stable && mask == different || unstable && changed)
@@ -3195,10 +3199,11 @@
meta.isCertain &&
!meta.stability.knownUnstable() &&
param != null -> {
- // if it's a changed flag then uncertain is a possible value. If it is uncertain
- // OR unstable, then we need to call changed. If it is uncertain or unstable here
- // it will _always_ be uncertain or unstable here, so this is safe. If it is not
- // uncertain or unstable, we can just check to see if its different
+ // if it's a changed flag or parameter with a default expression then uncertain is a
+ // possible value. If it is uncertain OR unstable, then we need to call changed.
+ // If it is uncertain or unstable here it will _always_ be uncertain or unstable
+ // here, so this is safe. If it is not uncertain or unstable, we can just check to
+ // see if its different
// unstableOrUncertain = mask xor 011 > 010
// invalid = invalid or ((unstableOrUncertain && changed()) || mask == different)
@@ -3318,6 +3323,12 @@
if (slotIndex != -1) {
meta.isCertain = true
meta.maskParam = scope.dirty
+ meta.hasNonStaticDefault = if (param is IrValueParameter) {
+ param.defaultValue?.expression?.isStatic() == false
+ } else {
+ // No default for this parameter
+ false
+ }
meta.maskSlot = slotIndex
}
}
diff --git a/compose/foundation/foundation/api/current.ignore b/compose/foundation/foundation/api/current.ignore
index cd093b7..7f85f5f 100644
--- a/compose/foundation/foundation/api/current.ignore
+++ b/compose/foundation/foundation/api/current.ignore
@@ -1,4 +1,8 @@
// Baseline format: 1.0
+AddedAbstractMethod: androidx.compose.foundation.pager.PageInfo#getKey():
+ Added method androidx.compose.foundation.pager.PageInfo.getKey()
+
+
RemovedClass: androidx.compose.foundation.text2.input.AllCapsTransformationKt:
Removed class androidx.compose.foundation.text2.input.AllCapsTransformationKt
RemovedClass: androidx.compose.foundation.text2.input.MaxLengthTransformationKt:
diff --git a/compose/foundation/foundation/api/current.txt b/compose/foundation/foundation/api/current.txt
index 2a5d1c3..3bc4d47 100644
--- a/compose/foundation/foundation/api/current.txt
+++ b/compose/foundation/foundation/api/current.txt
@@ -1156,10 +1156,12 @@
package androidx.compose.foundation.pager {
- @SuppressCompatibility @androidx.compose.foundation.ExperimentalFoundationApi public sealed interface PageInfo {
+ public sealed interface PageInfo {
method public int getIndex();
+ method public Object getKey();
method public int getOffset();
property public abstract int index;
+ property public abstract Object key;
property public abstract int offset;
}
@@ -1219,7 +1221,7 @@
property public abstract java.util.List<androidx.compose.foundation.pager.PageInfo> visiblePagesInfo;
}
- @SuppressCompatibility @androidx.compose.foundation.ExperimentalFoundationApi public sealed interface PagerScope {
+ public sealed interface PagerScope {
}
@androidx.compose.runtime.Stable public interface PagerSnapDistance {
diff --git a/compose/foundation/foundation/api/restricted_current.ignore b/compose/foundation/foundation/api/restricted_current.ignore
index cd093b7..7f85f5f 100644
--- a/compose/foundation/foundation/api/restricted_current.ignore
+++ b/compose/foundation/foundation/api/restricted_current.ignore
@@ -1,4 +1,8 @@
// Baseline format: 1.0
+AddedAbstractMethod: androidx.compose.foundation.pager.PageInfo#getKey():
+ Added method androidx.compose.foundation.pager.PageInfo.getKey()
+
+
RemovedClass: androidx.compose.foundation.text2.input.AllCapsTransformationKt:
Removed class androidx.compose.foundation.text2.input.AllCapsTransformationKt
RemovedClass: androidx.compose.foundation.text2.input.MaxLengthTransformationKt:
diff --git a/compose/foundation/foundation/api/restricted_current.txt b/compose/foundation/foundation/api/restricted_current.txt
index 6173895..2feeea9 100644
--- a/compose/foundation/foundation/api/restricted_current.txt
+++ b/compose/foundation/foundation/api/restricted_current.txt
@@ -1158,10 +1158,12 @@
package androidx.compose.foundation.pager {
- @SuppressCompatibility @androidx.compose.foundation.ExperimentalFoundationApi public sealed interface PageInfo {
+ public sealed interface PageInfo {
method public int getIndex();
+ method public Object getKey();
method public int getOffset();
property public abstract int index;
+ property public abstract Object key;
property public abstract int offset;
}
@@ -1221,7 +1223,7 @@
property public abstract java.util.List<androidx.compose.foundation.pager.PageInfo> visiblePagesInfo;
}
- @SuppressCompatibility @androidx.compose.foundation.ExperimentalFoundationApi public sealed interface PagerScope {
+ public sealed interface PagerScope {
}
@androidx.compose.runtime.Stable public interface PagerSnapDistance {
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/InteropTextFieldDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/InteropTextFieldDemo.kt
new file mode 100644
index 0000000..f236c62
--- /dev/null
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/InteropTextFieldDemo.kt
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.foundation.demos.text
+
+import android.widget.EditText
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.text.KeyboardOptions
+import androidx.compose.material.Text
+import androidx.compose.material.TextField
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.text.input.ImeAction
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.viewinterop.AndroidView
+
+@Composable
+fun InteropTextFieldDemo() {
+ var firstTextField by remember { mutableStateOf("") }
+ var secondTextField by remember { mutableStateOf("") }
+ Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
+ Text("First TextField")
+ TextField(
+ value = firstTextField,
+ onValueChange = { firstTextField = it },
+ Modifier.fillMaxWidth(),
+ keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next)
+ )
+
+ Text("First EditText")
+ AndroidView(factory = {
+ EditText(it)
+ }, Modifier.fillMaxWidth())
+
+ Text("Second TextField")
+ TextField(
+ value = secondTextField,
+ onValueChange = { secondTextField = it },
+ Modifier.fillMaxWidth(),
+ keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next)
+ )
+
+ Text("Second EditText")
+ AndroidView(factory = {
+ EditText(it)
+ }, Modifier.fillMaxWidth())
+ }
+}
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextDemos.kt
index 4a8c640..bbd3ef6 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextDemos.kt
@@ -142,6 +142,7 @@
ComposableDemo("Tail Following Text Field") { TailFollowingTextFieldDemo() },
ComposableDemo("Secondary input system") { PlatformTextInputAdapterDemo() },
ComposableDemo("Read-only field") { ReadOnlyTextFieldDemo() },
+ ComposableDemo("Interop") { InteropTextFieldDemo() }
)
),
DemoCategory(
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldFocusTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldFocusTest.kt
index 3ae4966..933c14d 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldFocusTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/CoreTextFieldFocusTest.kt
@@ -16,27 +16,99 @@
package androidx.compose.foundation.text
+import androidx.compose.foundation.focusable
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.size
import androidx.compose.runtime.RecomposeScope
import androidx.compose.runtime.currentRecomposeScope
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
+import androidx.compose.ui.focus.FocusManager
+import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.test.assertIsFocused
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.performClick
+import androidx.compose.ui.test.requestFocus
import androidx.compose.ui.text.input.TextFieldValue
+import androidx.compose.ui.unit.dp
import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
+import androidx.test.filters.MediumTest
+import kotlin.test.assertTrue
+import org.junit.Assert
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
-@SmallTest
+@MediumTest
@RunWith(AndroidJUnit4::class)
class CoreTextFieldFocusTest {
@get:Rule
val rule = createComposeRule()
+ val keyboardHelper = KeyboardHelper(rule)
+
+ @Test
+ fun hideKeyboardWhenDisposed() {
+ val value = TextFieldValue("initial text")
+ var toggle by mutableStateOf(true)
+ rule.setContent {
+ keyboardHelper.initialize()
+
+ if (toggle) {
+ CoreTextField(
+ value = value,
+ onValueChange = {},
+ modifier = Modifier.testTag("TextField")
+ )
+ }
+ }
+
+ rule.onNodeWithTag("TextField").requestFocus()
+ keyboardHelper.waitForKeyboardVisibility(true)
+ assertTrue(keyboardHelper.isSoftwareKeyboardShown())
+
+ toggle = false
+ rule.waitForIdle()
+
+ keyboardHelper.waitForKeyboardVisibility(false)
+ Assert.assertFalse(keyboardHelper.isSoftwareKeyboardShown())
+ }
+
+ @Test
+ fun hideKeyboardWhenFocusCleared() {
+ val value = TextFieldValue("initial text")
+ lateinit var focusManager: FocusManager
+ rule.setContent {
+ keyboardHelper.initialize()
+ focusManager = LocalFocusManager.current
+ Row {
+ // Extra focusable that takes initial focus when focus is cleared.
+ Box(Modifier.size(10.dp).focusable())
+ CoreTextField(
+ value = value,
+ onValueChange = {},
+ modifier = Modifier.testTag("TextField")
+ )
+ }
+ }
+
+ rule.onNodeWithTag("TextField").requestFocus()
+ keyboardHelper.waitForKeyboardVisibility(true)
+ assertTrue(keyboardHelper.isSoftwareKeyboardShown())
+
+ rule.runOnIdle {
+ focusManager.clearFocus()
+ }
+
+ keyboardHelper.waitForKeyboardVisibility(false)
+ Assert.assertFalse(keyboardHelper.isSoftwareKeyboardShown())
+ }
+
@Test
fun tapToFocus() {
// Arrange.
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextFieldSelectionGesturesTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextFieldSelectionGesturesTest.kt
index 4403d90..dfd3fd0 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextFieldSelectionGesturesTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text/selection/gestures/TextFieldSelectionGesturesTest.kt
@@ -64,19 +64,23 @@
rule.waitForIdle()
rule.onNodeWithTag(pointerAreaTag).performTouchInput { click(characterPosition(0)) }
rule.waitForIdle()
+ asserter.applyAndAssert {
+ cursorHandleShown = true
+ }
+ asserter.cursorHandleShown = false
+ // most tests first action will start a selection, so leave cursor handle as false
}
@Test
fun whenTouch_withLongPressOutOfBounds_nothingHappens() {
- asserter.applyAndAssert {
- cursorHandleShown = true
- }
-
performTouchGesture {
longPress(topStart.nudge(yDirection = UP))
}
- asserter.assert()
+ asserter.applyAndAssert {
+ cursorHandleShown = true
+ }
+
touchDragTo(topEnd.nudge(yDirection = UP))
asserter.assert()
}
@@ -86,12 +90,17 @@
textFieldValue.value = TextFieldValue()
rule.waitForIdle()
+ rule.onNodeWithTag(pointerAreaTag).performTouchInput { click() }
+
+ asserter.applyAndAssert {
+ textContent = ""
+ }
+
performTouchGesture {
longClick(center)
}
asserter.applyAndAssert {
- textContent = ""
textToolbarShown = true // paste will show up if clipboard is not empty
hapticsCount++
}
@@ -102,12 +111,17 @@
textFieldValue.value = TextFieldValue()
rule.waitForIdle()
+ rule.onNodeWithTag(pointerAreaTag).performTouchInput { click() }
+
+ asserter.applyAndAssert {
+ textContent = ""
+ }
+
performTouchGesture {
longPress(center)
}
asserter.applyAndAssert {
- textContent = ""
hapticsCount++
}
@@ -131,6 +145,12 @@
textFieldValue.value = TextFieldValue()
rule.waitForIdle()
+ rule.onNodeWithTag(pointerAreaTag).performTouchInput { click() }
+
+ asserter.applyAndAssert {
+ textContent = ""
+ }
+
performTouchGesture {
longPress(center)
}
@@ -525,14 +545,19 @@
textFieldValue.value = TextFieldValue(content)
rule.waitForIdle()
+ rule.onNodeWithTag(pointerAreaTag).performTouchInput { click(characterPosition(0)) }
+
+ asserter.applyAndAssert {
+ textContent = content
+ cursorHandleShown = true
+ }
+
performTouchGesture {
longPress(centerEnd)
}
asserter.applyAndAssert {
- textContent = content
selection = 6.collapsed
- cursorHandleShown = true
hapticsCount++
}
@@ -679,14 +704,19 @@
textFieldValue.value = TextFieldValue(content)
rule.waitForIdle()
+ rule.onNodeWithTag(pointerAreaTag).performTouchInput { click(characterPosition(0)) }
+
+ asserter.applyAndAssert {
+ textContent = content
+ cursorHandleShown = true
+ }
+
performTouchGesture {
longPress(bottomEnd)
}
asserter.applyAndAssert {
- textContent = content
selection = 7.collapsed
- cursorHandleShown = true
hapticsCount++
}
@@ -1101,14 +1131,21 @@
textFieldValue.value = TextFieldValue(content)
rule.waitForIdle()
+ rule.onNodeWithTag(pointerAreaTag).performTouchInput { click(characterPosition(0)) }
+
+ asserter.applyAndAssert {
+ textContent = content
+ cursorHandleShown = true
+ }
+
performTouchGesture {
longPress(characterPosition(content.lastIndex))
}
asserter.applyAndAssert {
- textContent = content
selection = 0 to content.length
selectionHandlesShown = true
+ cursorHandleShown = false
magnifierShown = true
hapticsCount++
}
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/BasicTextField2Test.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/BasicTextField2Test.kt
index 8533054d..4cba9a59 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/BasicTextField2Test.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/BasicTextField2Test.kt
@@ -21,10 +21,14 @@
import android.view.inputmethod.InputConnection
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.ScrollState
+import androidx.compose.foundation.focusable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.text.KeyboardHelper
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.text.TEST_FONT_FAMILY
import androidx.compose.foundation.text.selection.fetchTextLayoutResult
@@ -44,6 +48,7 @@
import androidx.compose.runtime.setValue
import androidx.compose.runtime.snapshotFlow
import androidx.compose.ui.Modifier
+import androidx.compose.ui.focus.FocusManager
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.graphics.Color
@@ -51,6 +56,7 @@
import androidx.compose.ui.platform.ClipboardManager
import androidx.compose.ui.platform.LocalClipboardManager
import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.platform.LocalWindowInfo
import androidx.compose.ui.platform.WindowInfo
@@ -92,7 +98,8 @@
import androidx.test.filters.SdkSuppress
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.flow.drop
-import org.junit.Ignore
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@@ -408,6 +415,63 @@
}
@Test
+ fun hideKeyboardWhenDisposed() {
+ val keyboardHelper = KeyboardHelper(rule)
+ val state = TextFieldState("initial text")
+ var toggle by mutableStateOf(true)
+ rule.setContent {
+ keyboardHelper.initialize()
+
+ if (toggle) {
+ BasicTextField2(
+ state = state,
+ modifier = Modifier.testTag("TextField")
+ )
+ }
+ }
+
+ rule.onNodeWithTag("TextField").requestFocus()
+ keyboardHelper.waitForKeyboardVisibility(true)
+ assertTrue(keyboardHelper.isSoftwareKeyboardShown())
+
+ toggle = false
+ rule.waitForIdle()
+
+ keyboardHelper.waitForKeyboardVisibility(false)
+ assertFalse(keyboardHelper.isSoftwareKeyboardShown())
+ }
+
+ @Test
+ fun hideKeyboardWhenFocusCleared() {
+ val keyboardHelper = KeyboardHelper(rule)
+ val state = TextFieldState("initial text")
+ lateinit var focusManager: FocusManager
+ rule.setContent {
+ keyboardHelper.initialize()
+ focusManager = LocalFocusManager.current
+ Row {
+ // Extra focusable that takes initial focus when focus is cleared.
+ Box(Modifier.size(10.dp).focusable())
+ BasicTextField2(
+ state = state,
+ modifier = Modifier.testTag("TextField")
+ )
+ }
+ }
+
+ rule.onNodeWithTag("TextField").requestFocus()
+ keyboardHelper.waitForKeyboardVisibility(true)
+ assertTrue(keyboardHelper.isSoftwareKeyboardShown())
+
+ rule.runOnIdle {
+ focusManager.clearFocus()
+ }
+
+ keyboardHelper.waitForKeyboardVisibility(false)
+ assertFalse(keyboardHelper.isSoftwareKeyboardShown())
+ }
+
+ @Test
fun textField_whenStateObjectChanges_newTextIsRendered() {
val state1 = TextFieldState("Hello")
val state2 = TextFieldState("World")
@@ -981,28 +1045,24 @@
rule.onNodeWithTag(Tag).assertIsNotFocused()
}
- @Ignore("b/297680209")
@Test
fun swipingTextFieldInScrollableContainer_doesNotGainFocus() {
val scrollState = ScrollState(0)
inputMethodInterceptor.setTextFieldTestContent {
Column(
Modifier
- .size(100.dp)
+ .height(100.dp)
.verticalScroll(scrollState)
) {
BasicTextField2(
state = rememberTextFieldState(),
modifier = Modifier.testTag(Tag)
)
- Box(Modifier.size(200.dp))
+ Box(Modifier.height(200.dp))
}
}
- rule.onNodeWithTag(Tag).performTouchInput {
- // swipe through
- swipeUp(durationMillis = 1000)
- }
+ rule.onNodeWithTag(Tag).performTouchInput { swipeUp() }
rule.onNodeWithTag(Tag).assertIsNotFocused()
assertThat(scrollState.value).isNotEqualTo(0)
}
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/TextFieldCursorTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/TextFieldCursorTest.kt
index de323bc..d9139e4 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/TextFieldCursorTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/TextFieldCursorTest.kt
@@ -194,7 +194,7 @@
.assertCursor(cursorTopCenterInLtr)
}
- @Ignore("b/305799612")
+ @FlakyTest(bugId = 305799612)
@Test
@SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
fun textFieldFocused_cursorRendered_rtlLayout() {
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/input/internal/undo/BasicTextField2UndoTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/input/internal/undo/BasicTextField2UndoTest.kt
index 8fcf05d..b20e406 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/input/internal/undo/BasicTextField2UndoTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/text2/input/internal/undo/BasicTextField2UndoTest.kt
@@ -38,10 +38,8 @@
import androidx.compose.ui.test.requestFocus
import androidx.compose.ui.text.TextRange
import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.FlakyTest
import androidx.test.filters.LargeTest
import com.google.common.truth.Truth.assertThat
-import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@@ -62,10 +60,10 @@
}
rule.onNode(hasSetTextAction()).performTextInput(", World")
- assertThat(state.text.toString()).isEqualTo("Hello, World")
+ state.assertText("Hello, World")
state.undoState.undo()
- assertThat(state.text.toString()).isEqualTo("Hello")
+ state.assertText("Hello")
rule.onNode(hasSetTextAction()).assertTextEquals("Hello")
}
@@ -95,10 +93,10 @@
}
rule.onNode(hasSetTextAction()).typeText(", World")
- assertThat(state.text.toString()).isEqualTo("Hello, World")
+ state.assertText("Hello, World")
state.undoState.undo()
- assertThat(state.text.toString()).isEqualTo("Hello")
+ state.assertText("Hello")
rule.onNode(hasSetTextAction()).assertTextEquals("Hello")
}
@@ -115,14 +113,14 @@
performTextInputSelection(TextRange(5))
performTextInput(" Compose")
}
- assertThat(state.text.toString()).isEqualTo("Hello Compose, World")
+ state.assertText("Hello Compose, World")
state.undoState.undo()
- assertThat(state.text.toString()).isEqualTo("Hello, World")
+ state.assertText("Hello, World")
rule.onNode(hasSetTextAction()).assertTextEquals("Hello, World")
state.undoState.undo()
- assertThat(state.text.toString()).isEqualTo("Hello")
+ state.assertText("Hello")
rule.onNode(hasSetTextAction()).assertTextEquals("Hello")
}
@@ -189,11 +187,10 @@
performTextInputSelection(TextRange(0, 5))
performTextInput("a")
}
- assertThat(state.text.toString()).isEqualTo("a")
+ state.assertTextAndSelection("a", TextRange(1))
state.undoState.undo()
- assertThat(state.text.toString()).isEqualTo("Hello")
- assertThat(state.text.selectionInChars).isEqualTo(TextRange(0, 5))
+ state.assertTextAndSelection("Hello", TextRange(0, 5))
}
@Test
@@ -208,14 +205,18 @@
performTextInputSelection(TextRange(2))
performTextInput(" abc ")
}
- assertThat(state.text.selectionInChars).isEqualTo(TextRange(7))
+
+ state.assertTextAndSelection("He abc llo", TextRange(7))
state.undoState.undo()
- assertThat(state.text.selectionInChars).isNotEqualTo(TextRange(7))
+ rule.runOnIdle {
+ assertThat(state.text.selectionInChars).isNotEqualTo(TextRange(7))
+ }
state.undoState.redo()
- assertThat(state.text.selectionInChars).isEqualTo(TextRange(7))
+
+ state.assertTextAndSelection("He abc llo", TextRange(7))
}
@Test
@@ -248,7 +249,6 @@
assertThat(state.undoState.canUndo).isFalse()
}
- @FlakyTest(bugId = 305090138)
@Test
fun clearHistory_removesAllUndoAndRedo() {
val state = TextFieldState()
@@ -265,20 +265,26 @@
typeText("ghi")
performTextClearance()
}
+ rule.waitForIdle()
state.undoState.undo()
+ rule.waitForIdle()
state.undoState.undo()
+ rule.waitForIdle()
state.undoState.undo()
- assertThat(state.undoState.canUndo).isTrue()
- assertThat(state.undoState.canRedo).isTrue()
+ rule.runOnIdle {
+ assertThat(state.undoState.canUndo).isTrue()
+ assertThat(state.undoState.canRedo).isTrue()
+ }
state.undoState.clearHistory()
- assertThat(state.undoState.canUndo).isFalse()
- assertThat(state.undoState.canRedo).isFalse()
+ rule.runOnIdle {
+ assertThat(state.undoState.canUndo).isFalse()
+ assertThat(state.undoState.canRedo).isFalse()
+ }
}
- @Ignore("b/308623690")
@Test
fun paste_neverMerges() {
val state = TextFieldState()
@@ -350,6 +356,12 @@
text.forEach { performTextInput(it.toString()) }
}
+ private fun TextFieldState.assertText(text: String) {
+ rule.runOnIdle {
+ assertThat(this.text.toString()).isEqualTo(text)
+ }
+ }
+
private fun TextFieldState.assertTextAndSelection(text: String, selection: TextRange) {
rule.runOnIdle {
assertThat(this.text.toString()).isEqualTo(text)
diff --git a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldCursorTest.kt b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldCursorTest.kt
index d4bacdf..27b2f23 100644
--- a/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldCursorTest.kt
+++ b/compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/textfield/TextFieldCursorTest.kt
@@ -111,7 +111,7 @@
// default onTextLayout to capture cursor boundaries.
private val onTextLayout: (TextLayoutResult) -> Unit = { cursorRect = it.getCursorRect(0) }
- @Ignore("b/305799612")
+ @FlakyTest(bugId = 305799612)
@Test
@SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
fun textFieldFocused_cursorRendered() = with(rule.density) {
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/MeasuredPage.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/MeasuredPage.kt
index 6586433..6339232 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/MeasuredPage.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/MeasuredPage.kt
@@ -16,7 +16,6 @@
package androidx.compose.foundation.pager
-import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.gestures.Orientation
import androidx.compose.ui.Alignment
import androidx.compose.ui.layout.Placeable
@@ -25,13 +24,12 @@
import androidx.compose.ui.util.fastForEach
import androidx.compose.ui.util.fastForEachIndexed
-@OptIn(ExperimentalFoundationApi::class)
internal class MeasuredPage(
override val index: Int,
val size: Int,
private val placeables: List<Placeable>,
private val visualOffset: IntOffset,
- val key: Any,
+ override val key: Any,
orientation: Orientation,
private val horizontalAlignment: Alignment.Horizontal?,
private val verticalAlignment: Alignment.Vertical?,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PageInfo.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PageInfo.kt
index 0e2f4b1..83a95be 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PageInfo.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PageInfo.kt
@@ -16,12 +16,9 @@
package androidx.compose.foundation.pager
-import androidx.compose.foundation.ExperimentalFoundationApi
-
/**
* This represents a single measured page in a [Pager] layout.
*/
-@ExperimentalFoundationApi
sealed interface PageInfo {
/**
@@ -30,6 +27,11 @@
val index: Int
/**
+ * The key of the page which was passed to the [HorizontalPager] or [VerticalPager] composables.
+ */
+ val key: Any
+
+ /**
* The main axis offset of the item in pixels. It is relative to the start of the [Pager]
* container.
*/
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerScope.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerScope.kt
index 9790ff5..3470def 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerScope.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerScope.kt
@@ -16,13 +16,10 @@
package androidx.compose.foundation.pager
-import androidx.compose.foundation.ExperimentalFoundationApi
-
/**
* Receiver scope for [Pager].
+ * Note: This is empty now, but we may add new members in the future if needed.
*/
-@ExperimentalFoundationApi
sealed interface PagerScope
-@OptIn(ExperimentalFoundationApi::class)
internal object PagerScopeImpl : PagerScope
diff --git a/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/ThreePaneScaffoldTest.kt b/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/ThreePaneScaffoldTest.kt
index e7833fe..f142449 100644
--- a/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/ThreePaneScaffoldTest.kt
+++ b/compose/material3/material3-adaptive/src/androidInstrumentedTest/kotlin/androidx/compose/material3/adaptive/ThreePaneScaffoldTest.kt
@@ -25,6 +25,9 @@
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.test.junit4.createComposeRule
@@ -106,6 +109,66 @@
rule.onNodeWithTag("SecondaryPane").assertExists()
rule.onNodeWithTag("TertiaryPane").assertExists()
}
+
+ @Test
+ fun threePaneScaffold_scaffoldValueChangeWithSinglePane_expandedPanesAreChanged() {
+ var testScaffoldValue by mutableStateOf(
+ ThreePaneScaffoldValue(
+ PaneAdaptedValue.Expanded,
+ PaneAdaptedValue.Hidden,
+ PaneAdaptedValue.Hidden
+ )
+ )
+ rule.setContent {
+ SampleThreePaneScaffold(scaffoldValue = testScaffoldValue)
+ }
+
+ rule.onNodeWithTag("PrimaryPane").assertExists()
+ rule.onNodeWithTag("SecondaryPane").assertDoesNotExist()
+ rule.onNodeWithTag("TertiaryPane").assertDoesNotExist()
+
+ testScaffoldValue = ThreePaneScaffoldValue(
+ PaneAdaptedValue.Hidden,
+ PaneAdaptedValue.Expanded,
+ PaneAdaptedValue.Hidden
+ )
+
+ rule.waitForIdle()
+
+ rule.onNodeWithTag("PrimaryPane").assertDoesNotExist()
+ rule.onNodeWithTag("SecondaryPane").assertExists()
+ rule.onNodeWithTag("TertiaryPane").assertDoesNotExist()
+ }
+
+ @Test
+ fun threePaneScaffold_scaffoldValueChangeWithDualPane_expandedPanesAreChanged() {
+ var testScaffoldValue by mutableStateOf(
+ ThreePaneScaffoldValue(
+ PaneAdaptedValue.Expanded,
+ PaneAdaptedValue.Hidden,
+ PaneAdaptedValue.Expanded
+ )
+ )
+ rule.setContent {
+ SampleThreePaneScaffold(scaffoldValue = testScaffoldValue)
+ }
+
+ rule.onNodeWithTag("PrimaryPane").assertExists()
+ rule.onNodeWithTag("SecondaryPane").assertDoesNotExist()
+ rule.onNodeWithTag("TertiaryPane").assertExists()
+
+ testScaffoldValue = ThreePaneScaffoldValue(
+ PaneAdaptedValue.Expanded,
+ PaneAdaptedValue.Expanded,
+ PaneAdaptedValue.Hidden
+ )
+
+ rule.waitForIdle()
+
+ rule.onNodeWithTag("PrimaryPane").assertExists()
+ rule.onNodeWithTag("SecondaryPane").assertExists()
+ rule.onNodeWithTag("TertiaryPane").assertDoesNotExist()
+ }
}
@OptIn(ExperimentalMaterial3AdaptiveApi::class)
diff --git a/compose/material3/material3-adaptive/src/androidMain/kotlin/androidx/compose/material3/adaptive/AndroidPosture.android.kt b/compose/material3/material3-adaptive/src/androidMain/kotlin/androidx/compose/material3/adaptive/AndroidPosture.android.kt
index 4c927dd..61ad91e 100644
--- a/compose/material3/material3-adaptive/src/androidMain/kotlin/androidx/compose/material3/adaptive/AndroidPosture.android.kt
+++ b/compose/material3/material3-adaptive/src/androidMain/kotlin/androidx/compose/material3/adaptive/AndroidPosture.android.kt
@@ -17,7 +17,6 @@
package androidx.compose.material3.adaptive
import androidx.compose.ui.graphics.toComposeRect
-import androidx.compose.ui.util.fastForEach
import androidx.window.layout.FoldingFeature
/**
@@ -28,7 +27,8 @@
fun calculatePosture(foldingFeatures: List<FoldingFeature>): Posture {
var isTableTop = false
val hingeList = mutableListOf<HingeInfo>()
- foldingFeatures.fastForEach {
+ @Suppress("ListIterator")
+ foldingFeatures.forEach {
if (it.orientation == FoldingFeature.Orientation.HORIZONTAL &&
it.state == FoldingFeature.State.HALF_OPENED) {
isTableTop = true
diff --git a/compose/material3/material3-adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/Posture.kt b/compose/material3/material3-adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/Posture.kt
index 71d734c..6455c51 100644
--- a/compose/material3/material3-adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/Posture.kt
+++ b/compose/material3/material3-adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/Posture.kt
@@ -18,8 +18,6 @@
import androidx.compose.runtime.Immutable
import androidx.compose.ui.geometry.Rect
-import androidx.compose.ui.util.fastJoinToString
-import androidx.compose.ui.util.fastMapNotNull
/**
* Posture info that can help make layout adaptation decisions. For example when
@@ -59,8 +57,9 @@
}
override fun toString(): String {
+ @Suppress("ListIterator")
return "Posture(isTabletop=$isTabletop, " +
- "hinges=[${hingeList.fastJoinToString(", ")}])"
+ "hinges=[${hingeList.joinToString(", ")}])"
}
}
@@ -149,4 +148,5 @@
@ExperimentalMaterial3AdaptiveApi
private inline fun List<HingeInfo>.getBounds(predicate: HingeInfo.() -> Boolean): List<Rect> =
- fastMapNotNull { if (it.predicate()) it.bounds else null }
+ @Suppress("ListIterator")
+ mapNotNull { if (it.predicate()) it.bounds else null }
diff --git a/compose/material3/material3-adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/ThreePaneScaffold.kt b/compose/material3/material3-adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/ThreePaneScaffold.kt
index f9df15c..ba79ab9a8 100644
--- a/compose/material3/material3-adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/ThreePaneScaffold.kt
+++ b/compose/material3/material3-adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/ThreePaneScaffold.kt
@@ -421,7 +421,8 @@
val actualTop = layoutBounds.top + topContentPadding
val actualBottom = layoutBounds.bottom - bottomContentPadding
// Assume hinge bounds are sorted from left to right, non-overlapped.
- scaffoldDirective.excludedBounds.fastForEach { hingeBound ->
+ @Suppress("ListIterator")
+ scaffoldDirective.excludedBounds.forEach { hingeBound ->
if (hingeBound.left <= actualLeft) {
// The hinge is at the left of the layout, adjust the left edge of
// the current partition to the actual displayable bounds.
@@ -431,7 +432,7 @@
// room for more partitions, adjust the right edge of the current
// partition to the actual displayable bounds.
actualRight = min(hingeBound.left, actualRight)
- return@fastForEach
+ return@forEach
} else {
// The hinge is inside the layout, add the current partition to the list
// and move the left edge of the next partition to the right of the
@@ -789,11 +790,11 @@
@OptIn(ExperimentalMaterial3AdaptiveApi::class)
private class ThreePaneScaffoldScopeImpl : ThreePaneScaffoldScope, PaneScaffoldScopeImpl() {
- override var paneAdaptedValue: PaneAdaptedValue = PaneAdaptedValue.Hidden
- override var positionAnimationSpec: FiniteAnimationSpec<IntOffset>? = null
- override var enterTransition: EnterTransition = EnterTransition.None
- override var exitTransition: ExitTransition = ExitTransition.None
- override var animationToolingLabel: String = ""
+ override var paneAdaptedValue by mutableStateOf(PaneAdaptedValue.Hidden)
+ override var positionAnimationSpec: FiniteAnimationSpec<IntOffset>? by mutableStateOf(null)
+ override var enterTransition by mutableStateOf(EnterTransition.None)
+ override var exitTransition by mutableStateOf(ExitTransition.None)
+ override var animationToolingLabel by mutableStateOf("")
}
/**
diff --git a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/CompositionTests.kt b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/CompositionTests.kt
index efbebc3..f8ca05a 100644
--- a/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/CompositionTests.kt
+++ b/compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/CompositionTests.kt
@@ -4073,6 +4073,28 @@
}
}
+ private val LocalNumber = compositionLocalOf { 0 }
+ @Composable fun Test(number: Int = LocalNumber.current) {
+ val remembered = remember(number) { number + 1 }
+ assertEquals(remembered, number + 1)
+ }
+
+ @Test
+ fun remember_defaultParamInRestartableFunction() = compositionTest {
+ var state by mutableIntStateOf(0)
+ compose {
+ CompositionLocalProvider(LocalNumber provides state) {
+ Test()
+ }
+ }
+
+ validate {}
+
+ state++
+ advance()
+ revalidate()
+ }
+
private inline fun CoroutineScope.withGlobalSnapshotManager(block: CoroutineScope.() -> Unit) {
val channel = Channel<Unit>(Channel.CONFLATED)
val job = launch {
diff --git a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/BitmapCapturingTest.kt b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/BitmapCapturingTest.kt
index df7537a..0b5c06c 100644
--- a/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/BitmapCapturingTest.kt
+++ b/compose/ui/ui-test/src/androidInstrumentedTest/kotlin/androidx/compose/ui/test/BitmapCapturingTest.kt
@@ -17,7 +17,6 @@
package androidx.compose.ui.test
import android.os.Build
-import android.view.View
import androidx.activity.ComponentActivity
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
@@ -33,7 +32,6 @@
import androidx.compose.testutils.assertPixels
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.platform.ViewRootForTest
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.compose.ui.unit.Density
@@ -295,17 +293,4 @@
else -> rule.setContent(content)
}
}
-
- private fun fetchNodeRootView(nodeTag: String): View {
- return fetchNodeInteraction(nodeTag).fetchRootView()
- }
-
- private fun fetchNodeInteraction(nodeTag: String): SemanticsNodeInteraction {
- return rule.onNodeWithTag(nodeTag)
- }
-}
-
-private fun SemanticsNodeInteraction.fetchRootView(): View {
- val node = fetchSemanticsNode()
- return (node.root as ViewRootForTest).view
}
diff --git a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/android/WindowCapture.android.kt b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/android/WindowCapture.android.kt
index 3de4273..524d18f 100644
--- a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/android/WindowCapture.android.kt
+++ b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/android/WindowCapture.android.kt
@@ -27,6 +27,7 @@
import android.view.Window
import androidx.annotation.DoNotInline
import androidx.annotation.RequiresApi
+import androidx.annotation.VisibleForTesting
import androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.test.ComposeTimeoutException
@@ -42,12 +43,42 @@
testContext: TestContext,
boundsInWindow: Rect,
): ImageBitmap {
- // Turn on hardware rendering, if necessary
- return withDrawingEnabled {
- // First force drawing to happen
- decorView.forceRedraw(testContext)
- // Then we generate the bitmap
- generateBitmap(boundsInWindow).asImageBitmap()
+ lateinit var imageBitmap: ImageBitmap
+ runWithRetryWhenNoData {
+ // Turn on hardware rendering, if necessary
+ imageBitmap = withDrawingEnabled {
+ // First force drawing to happen
+ decorView.forceRedraw(testContext)
+ // Then we generate the bitmap
+ generateBitmap(boundsInWindow).asImageBitmap()
+ }
+ }
+ return imageBitmap
+}
+
+@VisibleForTesting
+internal fun runWithRetryWhenNoData(retryBlock: () -> Unit) {
+ var retryAttempts = 0
+ var shouldRetry = true
+ while (shouldRetry) {
+ try {
+ shouldRetry = false
+ retryBlock()
+ } catch (e: PixelCopyException) {
+ // retry up to 3 times only if the resulting error is "source no data"
+ if (e.copyResultStatus == PixelCopy.ERROR_SOURCE_NO_DATA && retryAttempts >= 2) {
+ throw PixelCopyException(
+ e.copyResultStatus,
+ "PixelCopy failed with result ERROR_SOURCE_NO_DATA after 3 retry attempts!"
+ )
+ } else if (e.copyResultStatus == PixelCopy.ERROR_SOURCE_NO_DATA) {
+ shouldRetry = true
+ } else {
+ throw e
+ }
+ } finally {
+ retryAttempts++
+ }
}
}
@@ -125,10 +156,17 @@
throw AssertionError("Failed waiting for PixelCopy!")
}
if (copyResult != PixelCopy.SUCCESS) {
- throw AssertionError("PixelCopy failed with result $copyResult!")
+ throw PixelCopyException(copyResultStatus = copyResult)
}
}
+internal class PixelCopyException(
+ val copyResultStatus: Int,
+ message: String? = null
+) : RuntimeException(
+ message ?: "PixelCopy failed with result $copyResultStatus!"
+)
+
// Unfortunately this is a copy paste from AndroidComposeTestRule. At this moment it is a bit
// tricky to share this method. We can expose it on TestOwner in theory.
private fun MainTestClock.waitUntil(timeoutMillis: Long, condition: () -> Boolean) {
diff --git a/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/util/BitmapCapturingRetryLogicTest.kt b/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/util/BitmapCapturingRetryLogicTest.kt
new file mode 100644
index 0000000..3a6a1b3
--- /dev/null
+++ b/compose/ui/ui-test/src/androidUnitTest/kotlin/androidx/compose/ui/test/util/BitmapCapturingRetryLogicTest.kt
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.ui.test.util
+
+import android.view.PixelCopy
+import androidx.compose.testutils.expectError
+import androidx.compose.ui.test.android.PixelCopyException
+import androidx.compose.ui.test.android.runWithRetryWhenNoData
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.google.common.truth.Truth.assertThat
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class BitmapCapturingRetryLogicTest {
+
+ @get:Rule
+ val rule = createComposeRule()
+
+ @Test
+ fun pixelCopyRequest_succeeded_noRetries() {
+ var attempt = 0
+
+ expectError<PixelCopyException>(false) {
+ runWithRetryWhenNoData {
+ try {
+ // success
+ } finally {
+ attempt++
+ }
+ }
+ }
+
+ assertThat(attempt).isEqualTo(1)
+ }
+
+ @Test
+ fun pixelCopyRequest_succeeded_afterRetry_whenNoData() {
+ var attempt = 0
+
+ expectError<PixelCopyException>(false) {
+ runWithRetryWhenNoData {
+ try {
+ if (attempt == 0) {
+ throw PixelCopyException(PixelCopy.ERROR_SOURCE_NO_DATA)
+ } else {
+ // success
+ }
+ } finally {
+ attempt++
+ }
+ }
+ }
+ }
+
+ @Test
+ fun pixelCopyRequest_retry_whenNoData() {
+ var attempt = 0
+
+ expectError<PixelCopyException> {
+ runWithRetryWhenNoData {
+ try {
+ throw PixelCopyException(PixelCopy.ERROR_SOURCE_NO_DATA)
+ } finally {
+ attempt++
+ }
+ }
+ }
+ assertThat(attempt).isEqualTo(3)
+ }
+
+ @Test
+ fun pixelCopyRequest_error_rethrow() {
+ expectError<PixelCopyException> {
+ runWithRetryWhenNoData {
+ throw PixelCopyException(PixelCopy.ERROR_UNKNOWN)
+ }
+ }
+ }
+
+ @Test
+ fun pixelCopyRequest_error_rethrow_afterRetry() {
+ var attempt = 0
+
+ expectError<PixelCopyException> {
+ runWithRetryWhenNoData {
+ try {
+ if (attempt == 0) {
+ throw PixelCopyException(PixelCopy.ERROR_SOURCE_NO_DATA)
+ } else {
+ throw PixelCopyException(PixelCopy.ERROR_UNKNOWN)
+ }
+ } finally {
+ attempt++
+ }
+ }
+ }
+ assertThat(attempt).isEqualTo(2)
+ }
+}
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/ActualParagraph.android.kt.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/ActualParagraph.android.kt
similarity index 100%
rename from compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/ActualParagraph.android.kt.kt
rename to compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/ActualParagraph.android.kt
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraphIntrinsics.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraphIntrinsics.android.kt
index cd2f0b4..f3f75a6 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraphIntrinsics.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraphIntrinsics.android.kt
@@ -18,6 +18,7 @@
import android.graphics.Paint
import android.graphics.Typeface
+import android.view.View
import androidx.compose.runtime.State
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.EmojiSupportMatch
@@ -41,7 +42,6 @@
import androidx.compose.ui.text.style.TextDirection
import androidx.compose.ui.unit.Density
import androidx.core.text.TextUtilsCompat
-import androidx.core.view.ViewCompat
import java.util.Locale
@OptIn(InternalPlatformTextApi::class, ExperimentalTextApi::class)
@@ -164,8 +164,8 @@
(it[0].platformLocale as AndroidLocale).javaLocale
} ?: Locale.getDefault()
when (TextUtilsCompat.getLayoutDirectionFromLocale(currentLocale)) {
- ViewCompat.LAYOUT_DIRECTION_LTR -> LayoutCompat.TEXT_DIRECTION_FIRST_STRONG_LTR
- ViewCompat.LAYOUT_DIRECTION_RTL -> LayoutCompat.TEXT_DIRECTION_FIRST_STRONG_RTL
+ View.LAYOUT_DIRECTION_LTR -> LayoutCompat.TEXT_DIRECTION_FIRST_STRONG_LTR
+ View.LAYOUT_DIRECTION_RTL -> LayoutCompat.TEXT_DIRECTION_FIRST_STRONG_RTL
else -> LayoutCompat.TEXT_DIRECTION_FIRST_STRONG_LTR
}
}
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/AndroidAccessibilityTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/AndroidAccessibilityTest.kt
index c23dd06..9ddbace 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/AndroidAccessibilityTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/AndroidAccessibilityTest.kt
@@ -3621,7 +3621,7 @@
assertThat(colAccessibilityNode.childCount).isEqualTo(2)
assertThat(colSemanticsNode.replacedChildren.size).isEqualTo(2)
assertThat(buttonHolder.importantForAccessibility)
- .isEqualTo(ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES)
+ .isEqualTo(View.IMPORTANT_FOR_ACCESSIBILITY_YES)
assertThat((buttonHolder.getChildAt(0) as Button).text)
.isEqualTo(buttonText)
}
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.android.kt
index 7a8a72d..d9a5105 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.android.kt
@@ -912,10 +912,7 @@
androidViewsHandler.layoutNodeToHolder[layoutNode] = view
// Fetching AccessibilityNodeInfo from a View which is not set to
// IMPORTANT_FOR_ACCESSIBILITY_YES will return null.
- ViewCompat.setImportantForAccessibility(
- view,
- ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES
- )
+ view.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES)
val thisView = this
ViewCompat.setAccessibilityDelegate(
view,
@@ -992,10 +989,7 @@
androidViewsHandler.layoutNodeToHolder.remove(
androidViewsHandler.holderToLayoutNode.remove(view)
)
- ViewCompat.setImportantForAccessibility(
- view,
- ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_AUTO
- )
+ view.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_AUTO)
}
}
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt
index bce1f6e..7225ea3 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt
@@ -98,7 +98,6 @@
import androidx.compose.ui.util.fastRoundToInt
import androidx.core.util.keyIterator
import androidx.core.view.AccessibilityDelegateCompat
-import androidx.core.view.ViewCompat
import androidx.core.view.ViewCompat.ACCESSIBILITY_LIVE_REGION_ASSERTIVE
import androidx.core.view.ViewCompat.ACCESSIBILITY_LIVE_REGION_POLITE
import androidx.core.view.accessibility.AccessibilityEventCompat
@@ -495,7 +494,7 @@
val semanticsNodeWithAdjustedBounds = currentSemanticsNodes[virtualViewId] ?: return null
val semanticsNode: SemanticsNode = semanticsNodeWithAdjustedBounds.semanticsNode
if (virtualViewId == AccessibilityNodeProviderCompat.HOST_VIEW_ID) {
- info.setParent(ViewCompat.getParentForAccessibility(view) as? View)
+ info.setParent(view.getParentForAccessibility() as? View)
} else {
var parentId = checkNotNull(semanticsNode.parent?.id) {
"semanticsNode $virtualViewId has null parent"
@@ -1318,7 +1317,7 @@
// Unfortunately, talkback has a bug of using "checked", so we set state
// description here
if (role == Role.Switch && stateDescription == null) {
- stateDescription = view.context.resources.getString(R.string.on)
+ stateDescription = view.context.resources.getString(R.string.state_on)
}
}
@@ -1326,7 +1325,7 @@
// Unfortunately, talkback has a bug of using "not checked", so we set state
// description here
if (role == Role.Switch && stateDescription == null) {
- stateDescription = view.context.resources.getString(R.string.off)
+ stateDescription = view.context.resources.getString(R.string.state_off)
}
}
@@ -3544,6 +3543,20 @@
return
}
+ // This callback can be invoked from non UI thread.
+ if (Looper.getMainLooper().thread == Thread.currentThread()) {
+ doTranslation(accessibilityDelegateCompat, response)
+ } else {
+ accessibilityDelegateCompat.view.post {
+ doTranslation(accessibilityDelegateCompat, response)
+ }
+ }
+ }
+
+ private fun doTranslation(
+ accessibilityDelegateCompat: AndroidComposeViewAccessibilityDelegateCompat,
+ response: LongSparseArray<ViewTranslationResponse?>
+ ) {
for (key in response.keyIterator()) {
response.get(key)?.getValue(ViewTranslationRequest.ID_TEXT)?.text?.let {
accessibilityDelegateCompat.currentSemanticsNodes[key.toInt()]
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroid.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroid.android.kt
index 936ecb7..b3ac11e 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroid.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroid.android.kt
@@ -267,19 +267,6 @@
}
private fun processInputCommands() {
- // When focus changes to a non-Compose view, the system will take care of managing the
- // keyboard (via ImeFocusController) so we don't need to do anything. This can happen
- // when a Compose text field is focused, then the user taps on an EditText view.
- // And any commands that come in while we're not focused should also just be ignored,
- // since no unfocused view should be messing with the keyboard.
- // TODO(b/215761849) When focus moves to a different ComposeView than this one, this
- // logic doesn't work and the keyboard is not hidden.
- if (!view.isFocused) {
- // All queued commands should be ignored.
- textInputCommandQueue.clear()
- return
- }
-
// Multiple commands may have been queued up in the channel while this function was
// waiting to be resumed. We don't execute the commands as they come in because making a
// bunch of calls to change the actual IME quickly can result in flickers. Instead, we
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidPopup.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidPopup.android.kt
index 8379852..5e60f37 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidPopup.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidPopup.android.kt
@@ -31,6 +31,9 @@
import android.view.ViewGroup
import android.view.ViewOutlineProvider
import android.view.WindowManager
+import android.window.OnBackInvokedCallback
+import android.window.OnBackInvokedDispatcher
+import androidx.annotation.DoNotInline
import androidx.annotation.RequiresApi
import androidx.annotation.VisibleForTesting
import androidx.compose.runtime.Composable
@@ -429,6 +432,8 @@
}
})
+ private var backCallback: Any? = null
+
init {
id = android.R.id.content
setViewTreeLifecycleOwner(composeView.findViewTreeLifecycleOwner())
@@ -480,12 +485,14 @@
override fun onAttachedToWindow() {
super.onAttachedToWindow()
snapshotStateObserver.start()
+ maybeRegisterBackCallback()
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
snapshotStateObserver.stop()
snapshotStateObserver.clear()
+ maybeUnregisterBackCallback()
}
override fun internalOnMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
@@ -549,6 +556,23 @@
return super.dispatchKeyEvent(event)
}
+ private fun maybeRegisterBackCallback() {
+ if (!properties.dismissOnBackPress || Build.VERSION.SDK_INT < 33) {
+ return
+ }
+ if (backCallback == null) {
+ backCallback = Api33Impl.createBackCallback(onDismissRequest)
+ }
+ Api33Impl.maybeRegisterBackCallback(this, backCallback)
+ }
+
+ private fun maybeUnregisterBackCallback() {
+ if (Build.VERSION.SDK_INT >= 33) {
+ Api33Impl.maybeUnregisterBackCallback(this, backCallback)
+ }
+ backCallback = null
+ }
+
/**
* Set whether the popup can grab a focus and support dismissal.
*/
@@ -791,6 +815,33 @@
}
}
+@RequiresApi(33)
+private object Api33Impl {
+ @JvmStatic
+ @DoNotInline
+ fun createBackCallback(onDismissRequest: (() -> Unit)?) =
+ OnBackInvokedCallback { onDismissRequest?.invoke() }
+
+ @JvmStatic
+ @DoNotInline
+ fun maybeRegisterBackCallback(view: View, backCallback: Any?) {
+ if (backCallback is OnBackInvokedCallback) {
+ view.findOnBackInvokedDispatcher()?.registerOnBackInvokedCallback(
+ OnBackInvokedDispatcher.PRIORITY_OVERLAY,
+ backCallback
+ )
+ }
+ }
+
+ @JvmStatic
+ @DoNotInline
+ fun maybeUnregisterBackCallback(view: View, backCallback: Any?) {
+ if (backCallback is OnBackInvokedCallback) {
+ view.findOnBackInvokedDispatcher()?.unregisterOnBackInvokedCallback(backCallback)
+ }
+ }
+}
+
/**
* Collection of methods delegated to platform methods to support APIs only available on newer
* platforms and testing.
diff --git a/compose/ui/ui/src/androidMain/res/values-af/strings.xml b/compose/ui/ui/src/androidMain/res/values-af/strings.xml
index 0f09788..eb4e3db 100644
--- a/compose/ui/ui/src/androidMain/res/values-af/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-af/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Gedeeltelik gemerk"</string>
- <string name="on" msgid="8655164131929253426">"Aan"</string>
- <string name="off" msgid="875452955155264703">"Af"</string>
+ <string name="state_on" msgid="8655164131929253426">"Aan"</string>
+ <string name="state_off" msgid="875452955155264703">"Af"</string>
<string name="switch_role" msgid="2561197295334830845">"Skakel oor"</string>
<string name="selected" msgid="6043586758067023">"Gekies"</string>
<string name="not_selected" msgid="6610465462668679431">"Nie gekies nie"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-am/strings.xml b/compose/ui/ui/src/androidMain/res/values-am/strings.xml
index 538380e..5bc9f5a 100644
--- a/compose/ui/ui/src/androidMain/res/values-am/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-am/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"በከፊል የተፈተሸ"</string>
- <string name="on" msgid="8655164131929253426">"በርቷል"</string>
- <string name="off" msgid="875452955155264703">"ጠፍቷል"</string>
+ <string name="state_on" msgid="8655164131929253426">"በርቷል"</string>
+ <string name="state_off" msgid="875452955155264703">"ጠፍቷል"</string>
<string name="switch_role" msgid="2561197295334830845">"ማብሪያ/ማጥፊያ"</string>
<string name="selected" msgid="6043586758067023">"ተመርጧል"</string>
<string name="not_selected" msgid="6610465462668679431">"ያልተመረጡ"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-ar/strings.xml b/compose/ui/ui/src/androidMain/res/values-ar/strings.xml
index 0ae4b62..6534a73 100644
--- a/compose/ui/ui/src/androidMain/res/values-ar/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-ar/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"تم وضع علامة في المربّع بشكل جزئي"</string>
- <string name="on" msgid="8655164131929253426">"مفعّل"</string>
- <string name="off" msgid="875452955155264703">"غير مفعّل"</string>
+ <string name="state_on" msgid="8655164131929253426">"مفعّل"</string>
+ <string name="state_off" msgid="875452955155264703">"غير مفعّل"</string>
<string name="switch_role" msgid="2561197295334830845">"تبديل"</string>
<string name="selected" msgid="6043586758067023">"محدّد"</string>
<string name="not_selected" msgid="6610465462668679431">"غير محدّد"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-as/strings.xml b/compose/ui/ui/src/androidMain/res/values-as/strings.xml
index 50b42ca..2bfb082 100644
--- a/compose/ui/ui/src/androidMain/res/values-as/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-as/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"আংশিকভাৱে পৰীক্ষা কৰা হৈছে"</string>
- <string name="on" msgid="8655164131929253426">"অন কৰা আছে"</string>
- <string name="off" msgid="875452955155264703">"অফ আছে"</string>
+ <string name="state_on" msgid="8655164131929253426">"অন কৰা আছে"</string>
+ <string name="state_off" msgid="875452955155264703">"অফ আছে"</string>
<string name="switch_role" msgid="2561197295334830845">"ছুইচ"</string>
<string name="selected" msgid="6043586758067023">"বাছনি কৰা হৈছে"</string>
<string name="not_selected" msgid="6610465462668679431">"বাছনি কৰা হোৱা নাই"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-az/strings.xml b/compose/ui/ui/src/androidMain/res/values-az/strings.xml
index 2aeb117..b40ae60 100644
--- a/compose/ui/ui/src/androidMain/res/values-az/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-az/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Qismən yoxlanıb"</string>
- <string name="on" msgid="8655164131929253426">"Aktiv"</string>
- <string name="off" msgid="875452955155264703">"Deaktiv"</string>
+ <string name="state_on" msgid="8655164131929253426">"Aktiv"</string>
+ <string name="state_off" msgid="875452955155264703">"Deaktiv"</string>
<string name="switch_role" msgid="2561197295334830845">"Dəyişdirin"</string>
<string name="selected" msgid="6043586758067023">"Seçilib"</string>
<string name="not_selected" msgid="6610465462668679431">"Seçilməyib"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-b+sr+Latn/strings.xml b/compose/ui/ui/src/androidMain/res/values-b+sr+Latn/strings.xml
index 6b0adbe..9b1d96d 100644
--- a/compose/ui/ui/src/androidMain/res/values-b+sr+Latn/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-b+sr+Latn/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Delimično označeno"</string>
- <string name="on" msgid="8655164131929253426">"Uključeno"</string>
- <string name="off" msgid="875452955155264703">"Isključeno"</string>
+ <string name="state_on" msgid="8655164131929253426">"Uključeno"</string>
+ <string name="state_off" msgid="875452955155264703">"Isključeno"</string>
<string name="switch_role" msgid="2561197295334830845">"Prekidač"</string>
<string name="selected" msgid="6043586758067023">"Izabrano"</string>
<string name="not_selected" msgid="6610465462668679431">"Nije izabrano"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-be/strings.xml b/compose/ui/ui/src/androidMain/res/values-be/strings.xml
index 8eb5433..f05bf33 100644
--- a/compose/ui/ui/src/androidMain/res/values-be/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-be/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Выбрана часткова"</string>
- <string name="on" msgid="8655164131929253426">"Уключана"</string>
- <string name="off" msgid="875452955155264703">"Выключана"</string>
+ <string name="state_on" msgid="8655164131929253426">"Уключана"</string>
+ <string name="state_off" msgid="875452955155264703">"Выключана"</string>
<string name="switch_role" msgid="2561197295334830845">"Пераключальнік"</string>
<string name="selected" msgid="6043586758067023">"Выбрана"</string>
<string name="not_selected" msgid="6610465462668679431">"Не выбрана"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-bg/strings.xml b/compose/ui/ui/src/androidMain/res/values-bg/strings.xml
index 049ec87..09dc095 100644
--- a/compose/ui/ui/src/androidMain/res/values-bg/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-bg/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Частично отметнато"</string>
- <string name="on" msgid="8655164131929253426">"Вкл."</string>
- <string name="off" msgid="875452955155264703">"Изкл."</string>
+ <string name="state_on" msgid="8655164131929253426">"Вкл."</string>
+ <string name="state_off" msgid="875452955155264703">"Изкл."</string>
<string name="switch_role" msgid="2561197295334830845">"Превключване"</string>
<string name="selected" msgid="6043586758067023">"Избрано"</string>
<string name="not_selected" msgid="6610465462668679431">"Не е избрано"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-bn/strings.xml b/compose/ui/ui/src/androidMain/res/values-bn/strings.xml
index 698a059..8d8786f 100644
--- a/compose/ui/ui/src/androidMain/res/values-bn/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-bn/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"কয়েকটি বিকল্প বেছে নেওয়া হয়েছে"</string>
- <string name="on" msgid="8655164131929253426">"চালু আছে"</string>
- <string name="off" msgid="875452955155264703">"বন্ধ আছে"</string>
+ <string name="state_on" msgid="8655164131929253426">"চালু আছে"</string>
+ <string name="state_off" msgid="875452955155264703">"বন্ধ আছে"</string>
<string name="switch_role" msgid="2561197295334830845">"সুইচ"</string>
<string name="selected" msgid="6043586758067023">"বেছে নেওয়া হয়েছে"</string>
<string name="not_selected" msgid="6610465462668679431">"বেছে নেওয়া হয়নি"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-bs/strings.xml b/compose/ui/ui/src/androidMain/res/values-bs/strings.xml
index 69bab68f..b37dcc9 100644
--- a/compose/ui/ui/src/androidMain/res/values-bs/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-bs/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Djelimično označeno"</string>
- <string name="on" msgid="8655164131929253426">"Uključeno"</string>
- <string name="off" msgid="875452955155264703">"Isključeno"</string>
+ <string name="state_on" msgid="8655164131929253426">"Uključeno"</string>
+ <string name="state_off" msgid="875452955155264703">"Isključeno"</string>
<string name="switch_role" msgid="2561197295334830845">"Promijeni"</string>
<string name="selected" msgid="6043586758067023">"Odabrano"</string>
<string name="not_selected" msgid="6610465462668679431">"Nije odabrano"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-ca/strings.xml b/compose/ui/ui/src/androidMain/res/values-ca/strings.xml
index 93de37a..c238c2e 100644
--- a/compose/ui/ui/src/androidMain/res/values-ca/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-ca/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Marcat parcialment"</string>
- <string name="on" msgid="8655164131929253426">"Activat"</string>
- <string name="off" msgid="875452955155264703">"Desactivat"</string>
+ <string name="state_on" msgid="8655164131929253426">"Activat"</string>
+ <string name="state_off" msgid="875452955155264703">"Desactivat"</string>
<string name="switch_role" msgid="2561197295334830845">"Interruptor"</string>
<string name="selected" msgid="6043586758067023">"Seleccionat"</string>
<string name="not_selected" msgid="6610465462668679431">"No seleccionat"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-cs/strings.xml b/compose/ui/ui/src/androidMain/res/values-cs/strings.xml
index 80daf64..9fbcbf4 100644
--- a/compose/ui/ui/src/androidMain/res/values-cs/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-cs/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Částečně zaškrtnuto"</string>
- <string name="on" msgid="8655164131929253426">"Zapnuto"</string>
- <string name="off" msgid="875452955155264703">"Vypnuto"</string>
+ <string name="state_on" msgid="8655164131929253426">"Zapnuto"</string>
+ <string name="state_off" msgid="875452955155264703">"Vypnuto"</string>
<string name="switch_role" msgid="2561197295334830845">"Přepnout"</string>
<string name="selected" msgid="6043586758067023">"Vybráno"</string>
<string name="not_selected" msgid="6610465462668679431">"Nevybráno"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-da/strings.xml b/compose/ui/ui/src/androidMain/res/values-da/strings.xml
index 99eb486..a93c927 100644
--- a/compose/ui/ui/src/androidMain/res/values-da/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-da/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Delvist markeret"</string>
- <string name="on" msgid="8655164131929253426">"Til"</string>
- <string name="off" msgid="875452955155264703">"Fra"</string>
+ <string name="state_on" msgid="8655164131929253426">"Til"</string>
+ <string name="state_off" msgid="875452955155264703">"Fra"</string>
<string name="switch_role" msgid="2561197295334830845">"Kontakt"</string>
<string name="selected" msgid="6043586758067023">"Valgt"</string>
<string name="not_selected" msgid="6610465462668679431">"Ikke valgt"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-de/strings.xml b/compose/ui/ui/src/androidMain/res/values-de/strings.xml
index 9eb5c3b..efdcf31 100644
--- a/compose/ui/ui/src/androidMain/res/values-de/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-de/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Teilweise aktiviert"</string>
- <string name="on" msgid="8655164131929253426">"An"</string>
- <string name="off" msgid="875452955155264703">"Aus"</string>
+ <string name="state_on" msgid="8655164131929253426">"An"</string>
+ <string name="state_off" msgid="875452955155264703">"Aus"</string>
<string name="switch_role" msgid="2561197295334830845">"Wechseln"</string>
<string name="selected" msgid="6043586758067023">"Ausgewählt"</string>
<string name="not_selected" msgid="6610465462668679431">"Nicht ausgewählt"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-el/strings.xml b/compose/ui/ui/src/androidMain/res/values-el/strings.xml
index 1da628f..6c2c7d8 100644
--- a/compose/ui/ui/src/androidMain/res/values-el/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-el/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Έγινε μερικός έλεγχος"</string>
- <string name="on" msgid="8655164131929253426">"Ενεργό"</string>
- <string name="off" msgid="875452955155264703">"Ανενεργό"</string>
+ <string name="state_on" msgid="8655164131929253426">"Ενεργό"</string>
+ <string name="state_off" msgid="875452955155264703">"Ανενεργό"</string>
<string name="switch_role" msgid="2561197295334830845">"Εναλλαγή"</string>
<string name="selected" msgid="6043586758067023">"Επιλεγμένο"</string>
<string name="not_selected" msgid="6610465462668679431">"Δεν έχει επιλεχθεί"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-en-rAU/strings.xml b/compose/ui/ui/src/androidMain/res/values-en-rAU/strings.xml
index dbf19c5..bb93cc7 100644
--- a/compose/ui/ui/src/androidMain/res/values-en-rAU/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-en-rAU/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Partially ticked"</string>
- <string name="on" msgid="8655164131929253426">"On"</string>
- <string name="off" msgid="875452955155264703">"Off"</string>
+ <string name="state_on" msgid="8655164131929253426">"On"</string>
+ <string name="state_off" msgid="875452955155264703">"Off"</string>
<string name="switch_role" msgid="2561197295334830845">"Switch"</string>
<string name="selected" msgid="6043586758067023">"Selected"</string>
<string name="not_selected" msgid="6610465462668679431">"Not selected"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-en-rCA/strings.xml b/compose/ui/ui/src/androidMain/res/values-en-rCA/strings.xml
index 9df0af4..e31eb6f 100644
--- a/compose/ui/ui/src/androidMain/res/values-en-rCA/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-en-rCA/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Partially checked"</string>
- <string name="on" msgid="8655164131929253426">"On"</string>
- <string name="off" msgid="875452955155264703">"Off"</string>
+ <string name="state_on" msgid="8655164131929253426">"On"</string>
+ <string name="state_off" msgid="875452955155264703">"Off"</string>
<string name="switch_role" msgid="2561197295334830845">"Switch"</string>
<string name="selected" msgid="6043586758067023">"Selected"</string>
<string name="not_selected" msgid="6610465462668679431">"Not selected"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-en-rGB/strings.xml b/compose/ui/ui/src/androidMain/res/values-en-rGB/strings.xml
index dbf19c5..bb93cc7 100644
--- a/compose/ui/ui/src/androidMain/res/values-en-rGB/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-en-rGB/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Partially ticked"</string>
- <string name="on" msgid="8655164131929253426">"On"</string>
- <string name="off" msgid="875452955155264703">"Off"</string>
+ <string name="state_on" msgid="8655164131929253426">"On"</string>
+ <string name="state_off" msgid="875452955155264703">"Off"</string>
<string name="switch_role" msgid="2561197295334830845">"Switch"</string>
<string name="selected" msgid="6043586758067023">"Selected"</string>
<string name="not_selected" msgid="6610465462668679431">"Not selected"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-en-rIN/strings.xml b/compose/ui/ui/src/androidMain/res/values-en-rIN/strings.xml
index dbf19c5..bb93cc7 100644
--- a/compose/ui/ui/src/androidMain/res/values-en-rIN/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-en-rIN/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Partially ticked"</string>
- <string name="on" msgid="8655164131929253426">"On"</string>
- <string name="off" msgid="875452955155264703">"Off"</string>
+ <string name="state_on" msgid="8655164131929253426">"On"</string>
+ <string name="state_off" msgid="875452955155264703">"Off"</string>
<string name="switch_role" msgid="2561197295334830845">"Switch"</string>
<string name="selected" msgid="6043586758067023">"Selected"</string>
<string name="not_selected" msgid="6610465462668679431">"Not selected"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-en-rXC/strings.xml b/compose/ui/ui/src/androidMain/res/values-en-rXC/strings.xml
index ddd1168..efec474 100644
--- a/compose/ui/ui/src/androidMain/res/values-en-rXC/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-en-rXC/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Partially checked"</string>
- <string name="on" msgid="8655164131929253426">"On"</string>
- <string name="off" msgid="875452955155264703">"Off"</string>
+ <string name="state_on" msgid="8655164131929253426">"On"</string>
+ <string name="state_off" msgid="875452955155264703">"Off"</string>
<string name="switch_role" msgid="2561197295334830845">"Switch"</string>
<string name="selected" msgid="6043586758067023">"Selected"</string>
<string name="not_selected" msgid="6610465462668679431">"Not selected"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-es-rUS/strings.xml b/compose/ui/ui/src/androidMain/res/values-es-rUS/strings.xml
index 810018a..78571f1 100644
--- a/compose/ui/ui/src/androidMain/res/values-es-rUS/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-es-rUS/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Verificado parcialmente"</string>
- <string name="on" msgid="8655164131929253426">"Sí"</string>
- <string name="off" msgid="875452955155264703">"No"</string>
+ <string name="state_on" msgid="8655164131929253426">"Sí"</string>
+ <string name="state_off" msgid="875452955155264703">"No"</string>
<string name="switch_role" msgid="2561197295334830845">"Cambiar"</string>
<string name="selected" msgid="6043586758067023">"Seleccionado"</string>
<string name="not_selected" msgid="6610465462668679431">"Sin seleccionar"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-es/strings.xml b/compose/ui/ui/src/androidMain/res/values-es/strings.xml
index f5ff864..10518f6 100644
--- a/compose/ui/ui/src/androidMain/res/values-es/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-es/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Marcado parcialmente"</string>
- <string name="on" msgid="8655164131929253426">"Activado"</string>
- <string name="off" msgid="875452955155264703">"Desactivado"</string>
+ <string name="state_on" msgid="8655164131929253426">"Activado"</string>
+ <string name="state_off" msgid="875452955155264703">"Desactivado"</string>
<string name="switch_role" msgid="2561197295334830845">"Interruptor"</string>
<string name="selected" msgid="6043586758067023">"Seleccionado"</string>
<string name="not_selected" msgid="6610465462668679431">"No seleccionado"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-et/strings.xml b/compose/ui/ui/src/androidMain/res/values-et/strings.xml
index 071f163..9e41ee7 100644
--- a/compose/ui/ui/src/androidMain/res/values-et/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-et/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Osaliselt märgitud"</string>
- <string name="on" msgid="8655164131929253426">"Sees"</string>
- <string name="off" msgid="875452955155264703">"Väljas"</string>
+ <string name="state_on" msgid="8655164131929253426">"Sees"</string>
+ <string name="state_off" msgid="875452955155264703">"Väljas"</string>
<string name="switch_role" msgid="2561197295334830845">"Lüliti"</string>
<string name="selected" msgid="6043586758067023">"Valitud"</string>
<string name="not_selected" msgid="6610465462668679431">"Pole valitud"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-eu/strings.xml b/compose/ui/ui/src/androidMain/res/values-eu/strings.xml
index 4b2479a..675f56f 100644
--- a/compose/ui/ui/src/androidMain/res/values-eu/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-eu/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Erdi-markatuta"</string>
- <string name="on" msgid="8655164131929253426">"Aktibatuta"</string>
- <string name="off" msgid="875452955155264703">"Desaktibatuta"</string>
+ <string name="state_on" msgid="8655164131929253426">"Aktibatuta"</string>
+ <string name="state_off" msgid="875452955155264703">"Desaktibatuta"</string>
<string name="switch_role" msgid="2561197295334830845">"Aldatu"</string>
<string name="selected" msgid="6043586758067023">"Hautatuta"</string>
<string name="not_selected" msgid="6610465462668679431">"Hautatu gabe"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-fa/strings.xml b/compose/ui/ui/src/androidMain/res/values-fa/strings.xml
index cef1316..cdadb5f 100644
--- a/compose/ui/ui/src/androidMain/res/values-fa/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-fa/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"برخی موارد علامتگذاری شده است"</string>
- <string name="on" msgid="8655164131929253426">"روشن"</string>
- <string name="off" msgid="875452955155264703">"خاموش"</string>
+ <string name="state_on" msgid="8655164131929253426">"روشن"</string>
+ <string name="state_off" msgid="875452955155264703">"خاموش"</string>
<string name="switch_role" msgid="2561197295334830845">"کلید"</string>
<string name="selected" msgid="6043586758067023">"انتخاب شد"</string>
<string name="not_selected" msgid="6610465462668679431">"انتخابنشده"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-fi/strings.xml b/compose/ui/ui/src/androidMain/res/values-fi/strings.xml
index d689e5e..91de0ce 100644
--- a/compose/ui/ui/src/androidMain/res/values-fi/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-fi/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Osittain tarkistettu"</string>
- <string name="on" msgid="8655164131929253426">"Päällä"</string>
- <string name="off" msgid="875452955155264703">"Pois"</string>
+ <string name="state_on" msgid="8655164131929253426">"Päällä"</string>
+ <string name="state_off" msgid="875452955155264703">"Pois"</string>
<string name="switch_role" msgid="2561197295334830845">"Vaihda"</string>
<string name="selected" msgid="6043586758067023">"Valittu"</string>
<string name="not_selected" msgid="6610465462668679431">"Ei valittu"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-fr-rCA/strings.xml b/compose/ui/ui/src/androidMain/res/values-fr-rCA/strings.xml
index 8134827..fe5a9ee 100644
--- a/compose/ui/ui/src/androidMain/res/values-fr-rCA/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-fr-rCA/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Partiellement vérifié"</string>
- <string name="on" msgid="8655164131929253426">"Activé"</string>
- <string name="off" msgid="875452955155264703">"Désactivé"</string>
+ <string name="state_on" msgid="8655164131929253426">"Activé"</string>
+ <string name="state_off" msgid="875452955155264703">"Désactivé"</string>
<string name="switch_role" msgid="2561197295334830845">"Basculer"</string>
<string name="selected" msgid="6043586758067023">"Sélectionné"</string>
<string name="not_selected" msgid="6610465462668679431">"Non sélectionné"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-fr/strings.xml b/compose/ui/ui/src/androidMain/res/values-fr/strings.xml
index c919d89..6a2bb6e 100644
--- a/compose/ui/ui/src/androidMain/res/values-fr/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-fr/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Partiellement coché"</string>
- <string name="on" msgid="8655164131929253426">"Activé"</string>
- <string name="off" msgid="875452955155264703">"Désactivé"</string>
+ <string name="state_on" msgid="8655164131929253426">"Activé"</string>
+ <string name="state_off" msgid="875452955155264703">"Désactivé"</string>
<string name="switch_role" msgid="2561197295334830845">"Changer"</string>
<string name="selected" msgid="6043586758067023">"Sélectionné"</string>
<string name="not_selected" msgid="6610465462668679431">"Non sélectionné"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-gl/strings.xml b/compose/ui/ui/src/androidMain/res/values-gl/strings.xml
index 5b62280..f0d5293 100644
--- a/compose/ui/ui/src/androidMain/res/values-gl/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-gl/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Marcada parcialmente"</string>
- <string name="on" msgid="8655164131929253426">"Activado"</string>
- <string name="off" msgid="875452955155264703">"Desactivado"</string>
+ <string name="state_on" msgid="8655164131929253426">"Activado"</string>
+ <string name="state_off" msgid="875452955155264703">"Desactivado"</string>
<string name="switch_role" msgid="2561197295334830845">"Interruptor"</string>
<string name="selected" msgid="6043586758067023">"Seleccionado"</string>
<string name="not_selected" msgid="6610465462668679431">"Non seleccionado"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-gu/strings.xml b/compose/ui/ui/src/androidMain/res/values-gu/strings.xml
index 0c42b5b..20b3cc5 100644
--- a/compose/ui/ui/src/androidMain/res/values-gu/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-gu/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"આંશિક રીતે ચેક કરેલા વિકલ્પો"</string>
- <string name="on" msgid="8655164131929253426">"ચાલુ છે"</string>
- <string name="off" msgid="875452955155264703">"બંધ છે"</string>
+ <string name="state_on" msgid="8655164131929253426">"ચાલુ છે"</string>
+ <string name="state_off" msgid="875452955155264703">"બંધ છે"</string>
<string name="switch_role" msgid="2561197295334830845">"સ્વિચ"</string>
<string name="selected" msgid="6043586758067023">"પસંદગી કરી"</string>
<string name="not_selected" msgid="6610465462668679431">"પસંદગી કરી નથી"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-hi/strings.xml b/compose/ui/ui/src/androidMain/res/values-hi/strings.xml
index 8f80fdc..f9db678 100644
--- a/compose/ui/ui/src/androidMain/res/values-hi/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-hi/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"कुछ विकल्पों को चुना गया"</string>
- <string name="on" msgid="8655164131929253426">"चालू है"</string>
- <string name="off" msgid="875452955155264703">"बंद है"</string>
+ <string name="state_on" msgid="8655164131929253426">"चालू है"</string>
+ <string name="state_off" msgid="875452955155264703">"बंद है"</string>
<string name="switch_role" msgid="2561197295334830845">"स्विच करें"</string>
<string name="selected" msgid="6043586758067023">"चुना गया"</string>
<string name="not_selected" msgid="6610465462668679431">"नहीं चुना गया"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-hr/strings.xml b/compose/ui/ui/src/androidMain/res/values-hr/strings.xml
index ad31ee7..adf23b2 100644
--- a/compose/ui/ui/src/androidMain/res/values-hr/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-hr/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Djelomično potvrđeno"</string>
- <string name="on" msgid="8655164131929253426">"Uključeno"</string>
- <string name="off" msgid="875452955155264703">"Isključeno"</string>
+ <string name="state_on" msgid="8655164131929253426">"Uključeno"</string>
+ <string name="state_off" msgid="875452955155264703">"Isključeno"</string>
<string name="switch_role" msgid="2561197295334830845">"Prekidač"</string>
<string name="selected" msgid="6043586758067023">"Odabrano"</string>
<string name="not_selected" msgid="6610465462668679431">"Nije odabrano"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-hu/strings.xml b/compose/ui/ui/src/androidMain/res/values-hu/strings.xml
index 884b0f5..7f5cead 100644
--- a/compose/ui/ui/src/androidMain/res/values-hu/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-hu/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Részlegesen ellenőrizve"</string>
- <string name="on" msgid="8655164131929253426">"Be"</string>
- <string name="off" msgid="875452955155264703">"Ki"</string>
+ <string name="state_on" msgid="8655164131929253426">"Be"</string>
+ <string name="state_off" msgid="875452955155264703">"Ki"</string>
<string name="switch_role" msgid="2561197295334830845">"Kapcsoló"</string>
<string name="selected" msgid="6043586758067023">"Kijelölve"</string>
<string name="not_selected" msgid="6610465462668679431">"Nincs kijelölve"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-hy/strings.xml b/compose/ui/ui/src/androidMain/res/values-hy/strings.xml
index 0e21d53..71f5641 100644
--- a/compose/ui/ui/src/androidMain/res/values-hy/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-hy/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Մասնակի նշված"</string>
- <string name="on" msgid="8655164131929253426">"Միացված է"</string>
- <string name="off" msgid="875452955155264703">"Անջատված է"</string>
+ <string name="state_on" msgid="8655164131929253426">"Միացված է"</string>
+ <string name="state_off" msgid="875452955155264703">"Անջատված է"</string>
<string name="switch_role" msgid="2561197295334830845">"Փոխանջատիչ"</string>
<string name="selected" msgid="6043586758067023">"Ընտրված է"</string>
<string name="not_selected" msgid="6610465462668679431">"Ընտրված չէ"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-in/strings.xml b/compose/ui/ui/src/androidMain/res/values-in/strings.xml
index 92abab8..1552525 100644
--- a/compose/ui/ui/src/androidMain/res/values-in/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-in/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Diperiksa sebagian"</string>
- <string name="on" msgid="8655164131929253426">"Aktif"</string>
- <string name="off" msgid="875452955155264703">"Nonaktif"</string>
+ <string name="state_on" msgid="8655164131929253426">"Aktif"</string>
+ <string name="state_off" msgid="875452955155264703">"Nonaktif"</string>
<string name="switch_role" msgid="2561197295334830845">"Alihkan"</string>
<string name="selected" msgid="6043586758067023">"Dipilih"</string>
<string name="not_selected" msgid="6610465462668679431">"Tidak dipilih"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-is/strings.xml b/compose/ui/ui/src/androidMain/res/values-is/strings.xml
index 1bca170..1554557 100644
--- a/compose/ui/ui/src/androidMain/res/values-is/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-is/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Hakað við að hluta til"</string>
- <string name="on" msgid="8655164131929253426">"Kveikt"</string>
- <string name="off" msgid="875452955155264703">"Slökkt"</string>
+ <string name="state_on" msgid="8655164131929253426">"Kveikt"</string>
+ <string name="state_off" msgid="875452955155264703">"Slökkt"</string>
<string name="switch_role" msgid="2561197295334830845">"Skipta"</string>
<string name="selected" msgid="6043586758067023">"Valið"</string>
<string name="not_selected" msgid="6610465462668679431">"Ekki valið"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-it/strings.xml b/compose/ui/ui/src/androidMain/res/values-it/strings.xml
index 0b2a31a..a4c2800 100644
--- a/compose/ui/ui/src/androidMain/res/values-it/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-it/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Elemento parzialmente selezionato"</string>
- <string name="on" msgid="8655164131929253426">"On"</string>
- <string name="off" msgid="875452955155264703">"Off"</string>
+ <string name="state_on" msgid="8655164131929253426">"On"</string>
+ <string name="state_off" msgid="875452955155264703">"Off"</string>
<string name="switch_role" msgid="2561197295334830845">"Opzione"</string>
<string name="selected" msgid="6043586758067023">"Elemento selezionato"</string>
<string name="not_selected" msgid="6610465462668679431">"Opzione non selezionata"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-iw/strings.xml b/compose/ui/ui/src/androidMain/res/values-iw/strings.xml
index 7a66039..9197c9e 100644
--- a/compose/ui/ui/src/androidMain/res/values-iw/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-iw/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"מסומנת חלקית"</string>
- <string name="on" msgid="8655164131929253426">"פועל"</string>
- <string name="off" msgid="875452955155264703">"כבוי"</string>
+ <string name="state_on" msgid="8655164131929253426">"פועל"</string>
+ <string name="state_off" msgid="875452955155264703">"כבוי"</string>
<string name="switch_role" msgid="2561197295334830845">"מתג"</string>
<string name="selected" msgid="6043586758067023">"נבחר"</string>
<string name="not_selected" msgid="6610465462668679431">"לא נבחר"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-ja/strings.xml b/compose/ui/ui/src/androidMain/res/values-ja/strings.xml
index 37317bb..fe948a3 100644
--- a/compose/ui/ui/src/androidMain/res/values-ja/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-ja/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"一部 ON"</string>
- <string name="on" msgid="8655164131929253426">"オン"</string>
- <string name="off" msgid="875452955155264703">"オフ"</string>
+ <string name="state_on" msgid="8655164131929253426">"オン"</string>
+ <string name="state_off" msgid="875452955155264703">"オフ"</string>
<string name="switch_role" msgid="2561197295334830845">"切り替える"</string>
<string name="selected" msgid="6043586758067023">"選択済み"</string>
<string name="not_selected" msgid="6610465462668679431">"未選択"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-ka/strings.xml b/compose/ui/ui/src/androidMain/res/values-ka/strings.xml
index e1b2414..dccb67e 100644
--- a/compose/ui/ui/src/androidMain/res/values-ka/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-ka/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"ნაწილობრივ შემოწმებულია"</string>
- <string name="on" msgid="8655164131929253426">"ჩართული"</string>
- <string name="off" msgid="875452955155264703">"გამორთული"</string>
+ <string name="state_on" msgid="8655164131929253426">"ჩართული"</string>
+ <string name="state_off" msgid="875452955155264703">"გამორთული"</string>
<string name="switch_role" msgid="2561197295334830845">"გადართვა"</string>
<string name="selected" msgid="6043586758067023">"არჩეული"</string>
<string name="not_selected" msgid="6610465462668679431">"არ არის არჩეული"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-kk/strings.xml b/compose/ui/ui/src/androidMain/res/values-kk/strings.xml
index 9b1bb70..a370b0f 100644
--- a/compose/ui/ui/src/androidMain/res/values-kk/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-kk/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Жартылай белгіленді."</string>
- <string name="on" msgid="8655164131929253426">"Қосулы"</string>
- <string name="off" msgid="875452955155264703">"Өшірулі"</string>
+ <string name="state_on" msgid="8655164131929253426">"Қосулы"</string>
+ <string name="state_off" msgid="875452955155264703">"Өшірулі"</string>
<string name="switch_role" msgid="2561197295334830845">"Ауысу"</string>
<string name="selected" msgid="6043586758067023">"Таңдалды"</string>
<string name="not_selected" msgid="6610465462668679431">"Таңдалмады"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-km/strings.xml b/compose/ui/ui/src/androidMain/res/values-km/strings.xml
index f89ea75..947e4ca 100644
--- a/compose/ui/ui/src/androidMain/res/values-km/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-km/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"បានធីកខ្លះ"</string>
- <string name="on" msgid="8655164131929253426">"បើក"</string>
- <string name="off" msgid="875452955155264703">"បិទ"</string>
+ <string name="state_on" msgid="8655164131929253426">"បើក"</string>
+ <string name="state_off" msgid="875452955155264703">"បិទ"</string>
<string name="switch_role" msgid="2561197295334830845">"ប៊ូតុងបិទបើក"</string>
<string name="selected" msgid="6043586758067023">"បានជ្រើសរើស"</string>
<string name="not_selected" msgid="6610465462668679431">"មិនបានជ្រើសរើស"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-kn/strings.xml b/compose/ui/ui/src/androidMain/res/values-kn/strings.xml
index 42244c8..ce94cd5 100644
--- a/compose/ui/ui/src/androidMain/res/values-kn/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-kn/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"ಭಾಗಶಃ ಪರೀಕ್ಷಿಸಲಾಗಿದೆ"</string>
- <string name="on" msgid="8655164131929253426">"ಆನ್ ಆಗಿದೆ"</string>
- <string name="off" msgid="875452955155264703">"ಆಫ್ ಆಗಿದೆ"</string>
+ <string name="state_on" msgid="8655164131929253426">"ಆನ್ ಆಗಿದೆ"</string>
+ <string name="state_off" msgid="875452955155264703">"ಆಫ್ ಆಗಿದೆ"</string>
<string name="switch_role" msgid="2561197295334830845">"ಬದಲಿಸಿ"</string>
<string name="selected" msgid="6043586758067023">"ಆಯ್ಕೆಮಾಡಲಾಗಿದೆ"</string>
<string name="not_selected" msgid="6610465462668679431">"ಆಯ್ಕೆ ಮಾಡಿಲ್ಲ"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-ko/strings.xml b/compose/ui/ui/src/androidMain/res/values-ko/strings.xml
index 3d4979c..ad51a86 100644
--- a/compose/ui/ui/src/androidMain/res/values-ko/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-ko/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"일부 선택됨"</string>
- <string name="on" msgid="8655164131929253426">"켜짐"</string>
- <string name="off" msgid="875452955155264703">"꺼짐"</string>
+ <string name="state_on" msgid="8655164131929253426">"켜짐"</string>
+ <string name="state_off" msgid="875452955155264703">"꺼짐"</string>
<string name="switch_role" msgid="2561197295334830845">"스위치"</string>
<string name="selected" msgid="6043586758067023">"선택됨"</string>
<string name="not_selected" msgid="6610465462668679431">"선택되지 않음"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-ky/strings.xml b/compose/ui/ui/src/androidMain/res/values-ky/strings.xml
index 3ea8609..f43271de 100644
--- a/compose/ui/ui/src/androidMain/res/values-ky/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-ky/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Жарым-жартылай текшерилди"</string>
- <string name="on" msgid="8655164131929253426">"Күйүк"</string>
- <string name="off" msgid="875452955155264703">"Өчүк"</string>
+ <string name="state_on" msgid="8655164131929253426">"Күйүк"</string>
+ <string name="state_off" msgid="875452955155264703">"Өчүк"</string>
<string name="switch_role" msgid="2561197295334830845">"Которгуч"</string>
<string name="selected" msgid="6043586758067023">"Тандалды"</string>
<string name="not_selected" msgid="6610465462668679431">"Тандалган жок"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-lo/strings.xml b/compose/ui/ui/src/androidMain/res/values-lo/strings.xml
index 2675043..09c65dc 100644
--- a/compose/ui/ui/src/androidMain/res/values-lo/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-lo/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"ກວດສອບບາງສ່ວນແລ້ວ"</string>
- <string name="on" msgid="8655164131929253426">"ເປີດ"</string>
- <string name="off" msgid="875452955155264703">"ປິດ"</string>
+ <string name="state_on" msgid="8655164131929253426">"ເປີດ"</string>
+ <string name="state_off" msgid="875452955155264703">"ປິດ"</string>
<string name="switch_role" msgid="2561197295334830845">"ປຸ່ມກົດ"</string>
<string name="selected" msgid="6043586758067023">"ເລືອກແລ້ວ"</string>
<string name="not_selected" msgid="6610465462668679431">"ບໍ່ໄດ້ເລືອກ"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-lt/strings.xml b/compose/ui/ui/src/androidMain/res/values-lt/strings.xml
index 18f07c9..91af052 100644
--- a/compose/ui/ui/src/androidMain/res/values-lt/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-lt/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Iš dalies pažymėta"</string>
- <string name="on" msgid="8655164131929253426">"Įjungta"</string>
- <string name="off" msgid="875452955155264703">"Išjungta"</string>
+ <string name="state_on" msgid="8655164131929253426">"Įjungta"</string>
+ <string name="state_off" msgid="875452955155264703">"Išjungta"</string>
<string name="switch_role" msgid="2561197295334830845">"Jungiklis"</string>
<string name="selected" msgid="6043586758067023">"Pasirinkta"</string>
<string name="not_selected" msgid="6610465462668679431">"Nepasirinkta"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-lv/strings.xml b/compose/ui/ui/src/androidMain/res/values-lv/strings.xml
index 43d9c33..bf9b84f 100644
--- a/compose/ui/ui/src/androidMain/res/values-lv/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-lv/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Daļēji atzīmēta"</string>
- <string name="on" msgid="8655164131929253426">"Ieslēgts"</string>
- <string name="off" msgid="875452955155264703">"Izslēgts"</string>
+ <string name="state_on" msgid="8655164131929253426">"Ieslēgts"</string>
+ <string name="state_off" msgid="875452955155264703">"Izslēgts"</string>
<string name="switch_role" msgid="2561197295334830845">"Slēdzis"</string>
<string name="selected" msgid="6043586758067023">"Atlasīts"</string>
<string name="not_selected" msgid="6610465462668679431">"Nav atlasīts"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-mk/strings.xml b/compose/ui/ui/src/androidMain/res/values-mk/strings.xml
index bb92da8..ab40ec5 100644
--- a/compose/ui/ui/src/androidMain/res/values-mk/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-mk/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Делумно проверено"</string>
- <string name="on" msgid="8655164131929253426">"Вклучено"</string>
- <string name="off" msgid="875452955155264703">"Исклучено"</string>
+ <string name="state_on" msgid="8655164131929253426">"Вклучено"</string>
+ <string name="state_off" msgid="875452955155264703">"Исклучено"</string>
<string name="switch_role" msgid="2561197295334830845">"Прекинувач"</string>
<string name="selected" msgid="6043586758067023">"Избрано"</string>
<string name="not_selected" msgid="6610465462668679431">"Не е избрано"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-ml/strings.xml b/compose/ui/ui/src/androidMain/res/values-ml/strings.xml
index c67e83e..3710d32 100644
--- a/compose/ui/ui/src/androidMain/res/values-ml/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-ml/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"ഭാഗികമായി ചെക്ക് മാർക്കിട്ടു"</string>
- <string name="on" msgid="8655164131929253426">"ഓണാണ്"</string>
- <string name="off" msgid="875452955155264703">"ഓഫാണ്"</string>
+ <string name="state_on" msgid="8655164131929253426">"ഓണാണ്"</string>
+ <string name="state_off" msgid="875452955155264703">"ഓഫാണ്"</string>
<string name="switch_role" msgid="2561197295334830845">"മാറുക"</string>
<string name="selected" msgid="6043586758067023">"തിരഞ്ഞെടുത്തു"</string>
<string name="not_selected" msgid="6610465462668679431">"തിരഞ്ഞെടുത്തില്ല"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-mn/strings.xml b/compose/ui/ui/src/androidMain/res/values-mn/strings.xml
index 1d98eea..1e21df7 100644
--- a/compose/ui/ui/src/androidMain/res/values-mn/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-mn/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Хэсэгчлэн тэмдэглэсэн"</string>
- <string name="on" msgid="8655164131929253426">"Асаалттай"</string>
- <string name="off" msgid="875452955155264703">"Унтраалттай"</string>
+ <string name="state_on" msgid="8655164131929253426">"Асаалттай"</string>
+ <string name="state_off" msgid="875452955155264703">"Унтраалттай"</string>
<string name="switch_role" msgid="2561197295334830845">"Сэлгэх"</string>
<string name="selected" msgid="6043586758067023">"Сонгосон"</string>
<string name="not_selected" msgid="6610465462668679431">"Сонгоогүй"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-mr/strings.xml b/compose/ui/ui/src/androidMain/res/values-mr/strings.xml
index db02d08..71126d4 100644
--- a/compose/ui/ui/src/androidMain/res/values-mr/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-mr/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"अंशतः तपासले"</string>
- <string name="on" msgid="8655164131929253426">"सुरू आहे"</string>
- <string name="off" msgid="875452955155264703">"बंद आहे"</string>
+ <string name="state_on" msgid="8655164131929253426">"सुरू आहे"</string>
+ <string name="state_off" msgid="875452955155264703">"बंद आहे"</string>
<string name="switch_role" msgid="2561197295334830845">"स्विच"</string>
<string name="selected" msgid="6043586758067023">"निवडला"</string>
<string name="not_selected" msgid="6610465462668679431">"निवडला नाही"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-ms/strings.xml b/compose/ui/ui/src/androidMain/res/values-ms/strings.xml
index cca8e32..417c100 100644
--- a/compose/ui/ui/src/androidMain/res/values-ms/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-ms/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Sebahagiannya ditandai"</string>
- <string name="on" msgid="8655164131929253426">"Hidup"</string>
- <string name="off" msgid="875452955155264703">"Mati"</string>
+ <string name="state_on" msgid="8655164131929253426">"Hidup"</string>
+ <string name="state_off" msgid="875452955155264703">"Mati"</string>
<string name="switch_role" msgid="2561197295334830845">"Tukar"</string>
<string name="selected" msgid="6043586758067023">"Dipilih"</string>
<string name="not_selected" msgid="6610465462668679431">"Tidak dipilih"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-my/strings.xml b/compose/ui/ui/src/androidMain/res/values-my/strings.xml
index 465ef08..79b34b0 100644
--- a/compose/ui/ui/src/androidMain/res/values-my/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-my/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"တစ်ဝက်တစ်ပျက် စစ်ဆေးထားသည်"</string>
- <string name="on" msgid="8655164131929253426">"ဖွင့်"</string>
- <string name="off" msgid="875452955155264703">"ပိတ်"</string>
+ <string name="state_on" msgid="8655164131929253426">"ဖွင့်"</string>
+ <string name="state_off" msgid="875452955155264703">"ပိတ်"</string>
<string name="switch_role" msgid="2561197295334830845">"ပြောင်းရန်"</string>
<string name="selected" msgid="6043586758067023">"ရွေးထားသည်"</string>
<string name="not_selected" msgid="6610465462668679431">"ရွေးမထားပါ"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-nb/strings.xml b/compose/ui/ui/src/androidMain/res/values-nb/strings.xml
index 6ac8d13..7de85e7 100644
--- a/compose/ui/ui/src/androidMain/res/values-nb/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-nb/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Delvis avmerket"</string>
- <string name="on" msgid="8655164131929253426">"På"</string>
- <string name="off" msgid="875452955155264703">"Av"</string>
+ <string name="state_on" msgid="8655164131929253426">"På"</string>
+ <string name="state_off" msgid="875452955155264703">"Av"</string>
<string name="switch_role" msgid="2561197295334830845">"Bryter"</string>
<string name="selected" msgid="6043586758067023">"Valgt"</string>
<string name="not_selected" msgid="6610465462668679431">"Ikke valgt"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-ne/strings.xml b/compose/ui/ui/src/androidMain/res/values-ne/strings.xml
index 7e15748..61c2920 100644
--- a/compose/ui/ui/src/androidMain/res/values-ne/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-ne/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"आंशिक रूपमा जाँच गरिएको"</string>
- <string name="on" msgid="8655164131929253426">"अन छ"</string>
- <string name="off" msgid="875452955155264703">"अफ छ"</string>
+ <string name="state_on" msgid="8655164131929253426">"अन छ"</string>
+ <string name="state_off" msgid="875452955155264703">"अफ छ"</string>
<string name="switch_role" msgid="2561197295334830845">"बदल्नुहोस्"</string>
<string name="selected" msgid="6043586758067023">"चयन गरिएको छ"</string>
<string name="not_selected" msgid="6610465462668679431">"चयन गरिएको छैन"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-nl/strings.xml b/compose/ui/ui/src/androidMain/res/values-nl/strings.xml
index df57d19..ead225b 100644
--- a/compose/ui/ui/src/androidMain/res/values-nl/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-nl/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Gedeeltelijk aangevinkt"</string>
- <string name="on" msgid="8655164131929253426">"Aan"</string>
- <string name="off" msgid="875452955155264703">"Uit"</string>
+ <string name="state_on" msgid="8655164131929253426">"Aan"</string>
+ <string name="state_off" msgid="875452955155264703">"Uit"</string>
<string name="switch_role" msgid="2561197295334830845">"Overschakelen"</string>
<string name="selected" msgid="6043586758067023">"Geselecteerd"</string>
<string name="not_selected" msgid="6610465462668679431">"Niet geselecteerd"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-or/strings.xml b/compose/ui/ui/src/androidMain/res/values-or/strings.xml
index 36b8189..37ed3bf 100644
--- a/compose/ui/ui/src/androidMain/res/values-or/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-or/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"ଆଶିଂକ ଭାବେ ଯାଞ୍ଚ କରାଯାଇଛି"</string>
- <string name="on" msgid="8655164131929253426">"ଚାଲୁ ଅଛି"</string>
- <string name="off" msgid="875452955155264703">"ବନ୍ଦ ଅଛି"</string>
+ <string name="state_on" msgid="8655164131929253426">"ଚାଲୁ ଅଛି"</string>
+ <string name="state_off" msgid="875452955155264703">"ବନ୍ଦ ଅଛି"</string>
<string name="switch_role" msgid="2561197295334830845">"ସ୍ୱିଚ କରନ୍ତୁ"</string>
<string name="selected" msgid="6043586758067023">"ଚୟନିତ"</string>
<string name="not_selected" msgid="6610465462668679431">"ଚୟନ କରାଯାଇନାହିଁ"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-pa/strings.xml b/compose/ui/ui/src/androidMain/res/values-pa/strings.xml
index 269fe3f..6c96b2f 100644
--- a/compose/ui/ui/src/androidMain/res/values-pa/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-pa/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"ਅੰਸ਼ਕ ਤੌਰ ਤੇ ਜਾਂਚ ਕੀਤੀ ਗਈ"</string>
- <string name="on" msgid="8655164131929253426">"ਚਾਲੂ ਹੈ"</string>
- <string name="off" msgid="875452955155264703">"ਬੰਦ ਹੈ"</string>
+ <string name="state_on" msgid="8655164131929253426">"ਚਾਲੂ ਹੈ"</string>
+ <string name="state_off" msgid="875452955155264703">"ਬੰਦ ਹੈ"</string>
<string name="switch_role" msgid="2561197295334830845">"ਸਵਿੱਚ ਕਰੋ"</string>
<string name="selected" msgid="6043586758067023">"ਚੁਣੀ ਗਈ"</string>
<string name="not_selected" msgid="6610465462668679431">"ਚੁਣੀ ਨਹੀਂ ਗਈ"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-pl/strings.xml b/compose/ui/ui/src/androidMain/res/values-pl/strings.xml
index bbc7dd9..1ff0b56 100644
--- a/compose/ui/ui/src/androidMain/res/values-pl/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-pl/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Częściowo zaznaczone"</string>
- <string name="on" msgid="8655164131929253426">"Włączono"</string>
- <string name="off" msgid="875452955155264703">"Wyłączono"</string>
+ <string name="state_on" msgid="8655164131929253426">"Włączono"</string>
+ <string name="state_off" msgid="875452955155264703">"Wyłączono"</string>
<string name="switch_role" msgid="2561197295334830845">"Przełącznik"</string>
<string name="selected" msgid="6043586758067023">"Wybrano"</string>
<string name="not_selected" msgid="6610465462668679431">"Nie wybrano"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-pt-rBR/strings.xml b/compose/ui/ui/src/androidMain/res/values-pt-rBR/strings.xml
index e602a9f..572cbee 100644
--- a/compose/ui/ui/src/androidMain/res/values-pt-rBR/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-pt-rBR/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Parcialmente selecionada"</string>
- <string name="on" msgid="8655164131929253426">"Ativado"</string>
- <string name="off" msgid="875452955155264703">"Desativado"</string>
+ <string name="state_on" msgid="8655164131929253426">"Ativado"</string>
+ <string name="state_off" msgid="875452955155264703">"Desativado"</string>
<string name="switch_role" msgid="2561197295334830845">"Chave"</string>
<string name="selected" msgid="6043586758067023">"Selecionado"</string>
<string name="not_selected" msgid="6610465462668679431">"Não selecionado"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-pt-rPT/strings.xml b/compose/ui/ui/src/androidMain/res/values-pt-rPT/strings.xml
index 92b8419..0024ff8 100644
--- a/compose/ui/ui/src/androidMain/res/values-pt-rPT/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-pt-rPT/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Parcialmente selecionada"</string>
- <string name="on" msgid="8655164131929253426">"Ativado"</string>
- <string name="off" msgid="875452955155264703">"Desativado"</string>
+ <string name="state_on" msgid="8655164131929253426">"Ativado"</string>
+ <string name="state_off" msgid="875452955155264703">"Desativado"</string>
<string name="switch_role" msgid="2561197295334830845">"Mudar"</string>
<string name="selected" msgid="6043586758067023">"Selecionado"</string>
<string name="not_selected" msgid="6610465462668679431">"Não selecionado"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-pt/strings.xml b/compose/ui/ui/src/androidMain/res/values-pt/strings.xml
index e602a9f..572cbee 100644
--- a/compose/ui/ui/src/androidMain/res/values-pt/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-pt/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Parcialmente selecionada"</string>
- <string name="on" msgid="8655164131929253426">"Ativado"</string>
- <string name="off" msgid="875452955155264703">"Desativado"</string>
+ <string name="state_on" msgid="8655164131929253426">"Ativado"</string>
+ <string name="state_off" msgid="875452955155264703">"Desativado"</string>
<string name="switch_role" msgid="2561197295334830845">"Chave"</string>
<string name="selected" msgid="6043586758067023">"Selecionado"</string>
<string name="not_selected" msgid="6610465462668679431">"Não selecionado"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-ro/strings.xml b/compose/ui/ui/src/androidMain/res/values-ro/strings.xml
index 6123619..027697e 100644
--- a/compose/ui/ui/src/androidMain/res/values-ro/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-ro/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Bifată parțial"</string>
- <string name="on" msgid="8655164131929253426">"Activat"</string>
- <string name="off" msgid="875452955155264703">"Dezactivat"</string>
+ <string name="state_on" msgid="8655164131929253426">"Activat"</string>
+ <string name="state_off" msgid="875452955155264703">"Dezactivat"</string>
<string name="switch_role" msgid="2561197295334830845">"Comută"</string>
<string name="selected" msgid="6043586758067023">"Selectat"</string>
<string name="not_selected" msgid="6610465462668679431">"Neselectat"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-ru/strings.xml b/compose/ui/ui/src/androidMain/res/values-ru/strings.xml
index 39817d1..295cb11 100644
--- a/compose/ui/ui/src/androidMain/res/values-ru/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-ru/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Отмечено частично"</string>
- <string name="on" msgid="8655164131929253426">"Включено"</string>
- <string name="off" msgid="875452955155264703">"Отключено"</string>
+ <string name="state_on" msgid="8655164131929253426">"Включено"</string>
+ <string name="state_off" msgid="875452955155264703">"Отключено"</string>
<string name="switch_role" msgid="2561197295334830845">"Переключатель"</string>
<string name="selected" msgid="6043586758067023">"Выбрано"</string>
<string name="not_selected" msgid="6610465462668679431">"Не выбрано"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-si/strings.xml b/compose/ui/ui/src/androidMain/res/values-si/strings.xml
index 3610c5d..3fb091b 100644
--- a/compose/ui/ui/src/androidMain/res/values-si/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-si/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"අඩ වශයෙන් ලකුණු කළ"</string>
- <string name="on" msgid="8655164131929253426">"ක්රියාත්මකයි"</string>
- <string name="off" msgid="875452955155264703">"ක්රියාවිරහිතයි"</string>
+ <string name="state_on" msgid="8655164131929253426">"ක්රියාත්මකයි"</string>
+ <string name="state_off" msgid="875452955155264703">"ක්රියාවිරහිතයි"</string>
<string name="switch_role" msgid="2561197295334830845">"මාරු කරන්න"</string>
<string name="selected" msgid="6043586758067023">"තෝරන ලදි"</string>
<string name="not_selected" msgid="6610465462668679431">"තෝරා නැත"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-sk/strings.xml b/compose/ui/ui/src/androidMain/res/values-sk/strings.xml
index 1ef5d97..9e11bd95 100644
--- a/compose/ui/ui/src/androidMain/res/values-sk/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-sk/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Čiastočne začiarknuté"</string>
- <string name="on" msgid="8655164131929253426">"Zapnuté"</string>
- <string name="off" msgid="875452955155264703">"Vypnuté"</string>
+ <string name="state_on" msgid="8655164131929253426">"Zapnuté"</string>
+ <string name="state_off" msgid="875452955155264703">"Vypnuté"</string>
<string name="switch_role" msgid="2561197295334830845">"Prepnúť"</string>
<string name="selected" msgid="6043586758067023">"Vybrané"</string>
<string name="not_selected" msgid="6610465462668679431">"Nevybrané"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-sl/strings.xml b/compose/ui/ui/src/androidMain/res/values-sl/strings.xml
index 121a772..2ce13d7 100644
--- a/compose/ui/ui/src/androidMain/res/values-sl/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-sl/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Delno potrjeno"</string>
- <string name="on" msgid="8655164131929253426">"Vklopljeno"</string>
- <string name="off" msgid="875452955155264703">"Izklopljeno"</string>
+ <string name="state_on" msgid="8655164131929253426">"Vklopljeno"</string>
+ <string name="state_off" msgid="875452955155264703">"Izklopljeno"</string>
<string name="switch_role" msgid="2561197295334830845">"Stikalo"</string>
<string name="selected" msgid="6043586758067023">"Izbrano"</string>
<string name="not_selected" msgid="6610465462668679431">"Ni izbrano"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-sq/strings.xml b/compose/ui/ui/src/androidMain/res/values-sq/strings.xml
index 7f8ce7b..3dc62af 100644
--- a/compose/ui/ui/src/androidMain/res/values-sq/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-sq/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Pjesërisht e shënuar"</string>
- <string name="on" msgid="8655164131929253426">"Aktiv"</string>
- <string name="off" msgid="875452955155264703">"Joaktiv"</string>
+ <string name="state_on" msgid="8655164131929253426">"Aktiv"</string>
+ <string name="state_off" msgid="875452955155264703">"Joaktiv"</string>
<string name="switch_role" msgid="2561197295334830845">"Ndërro"</string>
<string name="selected" msgid="6043586758067023">"Zgjedhur"</string>
<string name="not_selected" msgid="6610465462668679431">"Nuk është zgjedhur"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-sr/strings.xml b/compose/ui/ui/src/androidMain/res/values-sr/strings.xml
index 466b1b6..564dac6 100644
--- a/compose/ui/ui/src/androidMain/res/values-sr/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-sr/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Делимично означено"</string>
- <string name="on" msgid="8655164131929253426">"Укључено"</string>
- <string name="off" msgid="875452955155264703">"Искључено"</string>
+ <string name="state_on" msgid="8655164131929253426">"Укључено"</string>
+ <string name="state_off" msgid="875452955155264703">"Искључено"</string>
<string name="switch_role" msgid="2561197295334830845">"Прекидач"</string>
<string name="selected" msgid="6043586758067023">"Изабрано"</string>
<string name="not_selected" msgid="6610465462668679431">"Није изабрано"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-sv/strings.xml b/compose/ui/ui/src/androidMain/res/values-sv/strings.xml
index 185737c..3dbaf6b 100644
--- a/compose/ui/ui/src/androidMain/res/values-sv/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-sv/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Delvis markerad"</string>
- <string name="on" msgid="8655164131929253426">"På"</string>
- <string name="off" msgid="875452955155264703">"Av"</string>
+ <string name="state_on" msgid="8655164131929253426">"På"</string>
+ <string name="state_off" msgid="875452955155264703">"Av"</string>
<string name="switch_role" msgid="2561197295334830845">"Reglage"</string>
<string name="selected" msgid="6043586758067023">"Valt"</string>
<string name="not_selected" msgid="6610465462668679431">"Inte vald"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-sw/strings.xml b/compose/ui/ui/src/androidMain/res/values-sw/strings.xml
index 00e3d61..09b9640 100644
--- a/compose/ui/ui/src/androidMain/res/values-sw/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-sw/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Imekaguliwa kwa kiasi fulani"</string>
- <string name="on" msgid="8655164131929253426">"Imewashwa"</string>
- <string name="off" msgid="875452955155264703">"Imezimwa"</string>
+ <string name="state_on" msgid="8655164131929253426">"Imewashwa"</string>
+ <string name="state_off" msgid="875452955155264703">"Imezimwa"</string>
<string name="switch_role" msgid="2561197295334830845">"Swichi"</string>
<string name="selected" msgid="6043586758067023">"Umechagua"</string>
<string name="not_selected" msgid="6610465462668679431">"Hujachagua"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-ta/strings.xml b/compose/ui/ui/src/androidMain/res/values-ta/strings.xml
index de9bb21..81407fa 100644
--- a/compose/ui/ui/src/androidMain/res/values-ta/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-ta/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"சில மட்டுமே தேர்ந்தெடுக்கப்பட்டுள்ளன"</string>
- <string name="on" msgid="8655164131929253426">"இயக்கப்பட்டுள்ளது"</string>
- <string name="off" msgid="875452955155264703">"முடக்கப்பட்டுள்ளது"</string>
+ <string name="state_on" msgid="8655164131929253426">"இயக்கப்பட்டுள்ளது"</string>
+ <string name="state_off" msgid="875452955155264703">"முடக்கப்பட்டுள்ளது"</string>
<string name="switch_role" msgid="2561197295334830845">"மாற்றுதல்"</string>
<string name="selected" msgid="6043586758067023">"தேர்ந்தெடுக்கப்பட்டுள்ளது"</string>
<string name="not_selected" msgid="6610465462668679431">"தேர்ந்தெடுக்கப்படவில்லை"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-te/strings.xml b/compose/ui/ui/src/androidMain/res/values-te/strings.xml
index 598e8c5..2b3c28a 100644
--- a/compose/ui/ui/src/androidMain/res/values-te/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-te/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"పాక్షికంగా ఎంచుకోబడింది"</string>
- <string name="on" msgid="8655164131929253426">"ఆన్లో ఉంది"</string>
- <string name="off" msgid="875452955155264703">"ఆఫ్లో ఉంది"</string>
+ <string name="state_on" msgid="8655164131929253426">"ఆన్లో ఉంది"</string>
+ <string name="state_off" msgid="875452955155264703">"ఆఫ్లో ఉంది"</string>
<string name="switch_role" msgid="2561197295334830845">"Switch"</string>
<string name="selected" msgid="6043586758067023">"ఎంచుకోబడింది"</string>
<string name="not_selected" msgid="6610465462668679431">"ఎంచుకోబడలేదు"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-th/strings.xml b/compose/ui/ui/src/androidMain/res/values-th/strings.xml
index f0a1576..cf658f4 100644
--- a/compose/ui/ui/src/androidMain/res/values-th/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-th/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"เลือกบางส่วน"</string>
- <string name="on" msgid="8655164131929253426">"เปิด"</string>
- <string name="off" msgid="875452955155264703">"ปิด"</string>
+ <string name="state_on" msgid="8655164131929253426">"เปิด"</string>
+ <string name="state_off" msgid="875452955155264703">"ปิด"</string>
<string name="switch_role" msgid="2561197295334830845">"เปลี่ยน"</string>
<string name="selected" msgid="6043586758067023">"เลือกไว้"</string>
<string name="not_selected" msgid="6610465462668679431">"ไม่ได้เลือก"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-tl/strings.xml b/compose/ui/ui/src/androidMain/res/values-tl/strings.xml
index cbebde9..7551c981 100644
--- a/compose/ui/ui/src/androidMain/res/values-tl/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-tl/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Bahagyang may check"</string>
- <string name="on" msgid="8655164131929253426">"Naka-on"</string>
- <string name="off" msgid="875452955155264703">"Naka-off"</string>
+ <string name="state_on" msgid="8655164131929253426">"Naka-on"</string>
+ <string name="state_off" msgid="875452955155264703">"Naka-off"</string>
<string name="switch_role" msgid="2561197295334830845">"Lumipat"</string>
<string name="selected" msgid="6043586758067023">"Napili"</string>
<string name="not_selected" msgid="6610465462668679431">"Hindi napili"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-tr/strings.xml b/compose/ui/ui/src/androidMain/res/values-tr/strings.xml
index 7be7793..29e403f 100644
--- a/compose/ui/ui/src/androidMain/res/values-tr/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-tr/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Kısmi olarak kontrol edildi"</string>
- <string name="on" msgid="8655164131929253426">"Açık"</string>
- <string name="off" msgid="875452955155264703">"Kapalı"</string>
+ <string name="state_on" msgid="8655164131929253426">"Açık"</string>
+ <string name="state_off" msgid="875452955155264703">"Kapalı"</string>
<string name="switch_role" msgid="2561197295334830845">"Anahtar"</string>
<string name="selected" msgid="6043586758067023">"Seçili"</string>
<string name="not_selected" msgid="6610465462668679431">"Seçili değil"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-uk/strings.xml b/compose/ui/ui/src/androidMain/res/values-uk/strings.xml
index a16e78a..ce2f540 100644
--- a/compose/ui/ui/src/androidMain/res/values-uk/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-uk/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Частково вибрано"</string>
- <string name="on" msgid="8655164131929253426">"Увімкнено"</string>
- <string name="off" msgid="875452955155264703">"Вимкнено"</string>
+ <string name="state_on" msgid="8655164131929253426">"Увімкнено"</string>
+ <string name="state_off" msgid="875452955155264703">"Вимкнено"</string>
<string name="switch_role" msgid="2561197295334830845">"Перемикач"</string>
<string name="selected" msgid="6043586758067023">"Вибрано"</string>
<string name="not_selected" msgid="6610465462668679431">"Не вибрано"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-ur/strings.xml b/compose/ui/ui/src/androidMain/res/values-ur/strings.xml
index d2cfa69..db2e2a8 100644
--- a/compose/ui/ui/src/androidMain/res/values-ur/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-ur/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"جزوی طور پر چیک کردہ"</string>
- <string name="on" msgid="8655164131929253426">"آن ہے"</string>
- <string name="off" msgid="875452955155264703">"آف ہے"</string>
+ <string name="state_on" msgid="8655164131929253426">"آن ہے"</string>
+ <string name="state_off" msgid="875452955155264703">"آف ہے"</string>
<string name="switch_role" msgid="2561197295334830845">"سوئچ"</string>
<string name="selected" msgid="6043586758067023">"منتخب کردہ"</string>
<string name="not_selected" msgid="6610465462668679431">"غیر منتخب کردہ"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-uz/strings.xml b/compose/ui/ui/src/androidMain/res/values-uz/strings.xml
index 2fca41c..6459eee 100644
--- a/compose/ui/ui/src/androidMain/res/values-uz/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-uz/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Qisman belgilandi"</string>
- <string name="on" msgid="8655164131929253426">"Yoniq"</string>
- <string name="off" msgid="875452955155264703">"Oʻchiq"</string>
+ <string name="state_on" msgid="8655164131929253426">"Yoniq"</string>
+ <string name="state_off" msgid="875452955155264703">"Oʻchiq"</string>
<string name="switch_role" msgid="2561197295334830845">"Almashtirish"</string>
<string name="selected" msgid="6043586758067023">"Tanlangan"</string>
<string name="not_selected" msgid="6610465462668679431">"Tanlanmagan"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-vi/strings.xml b/compose/ui/ui/src/androidMain/res/values-vi/strings.xml
index c083d08..0da2126 100644
--- a/compose/ui/ui/src/androidMain/res/values-vi/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-vi/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Đã kiểm tra một phần"</string>
- <string name="on" msgid="8655164131929253426">"Đang bật"</string>
- <string name="off" msgid="875452955155264703">"Đang tắt"</string>
+ <string name="state_on" msgid="8655164131929253426">"Đang bật"</string>
+ <string name="state_off" msgid="875452955155264703">"Đang tắt"</string>
<string name="switch_role" msgid="2561197295334830845">"Chuyển"</string>
<string name="selected" msgid="6043586758067023">"Đã chọn"</string>
<string name="not_selected" msgid="6610465462668679431">"Chưa chọn"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-zh-rCN/strings.xml b/compose/ui/ui/src/androidMain/res/values-zh-rCN/strings.xml
index 4277175..de0a846 100644
--- a/compose/ui/ui/src/androidMain/res/values-zh-rCN/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-zh-rCN/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"部分选中"</string>
- <string name="on" msgid="8655164131929253426">"已开启"</string>
- <string name="off" msgid="875452955155264703">"已关闭"</string>
+ <string name="state_on" msgid="8655164131929253426">"已开启"</string>
+ <string name="state_off" msgid="875452955155264703">"已关闭"</string>
<string name="switch_role" msgid="2561197295334830845">"开关"</string>
<string name="selected" msgid="6043586758067023">"已选择"</string>
<string name="not_selected" msgid="6610465462668679431">"未选择"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-zh-rHK/strings.xml b/compose/ui/ui/src/androidMain/res/values-zh-rHK/strings.xml
index b746a8b..f7ef924 100644
--- a/compose/ui/ui/src/androidMain/res/values-zh-rHK/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-zh-rHK/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"部分剔咗"</string>
- <string name="on" msgid="8655164131929253426">"開"</string>
- <string name="off" msgid="875452955155264703">"閂"</string>
+ <string name="state_on" msgid="8655164131929253426">"開"</string>
+ <string name="state_off" msgid="875452955155264703">"閂"</string>
<string name="switch_role" msgid="2561197295334830845">"按鈕裝置"</string>
<string name="selected" msgid="6043586758067023">"揀咗"</string>
<string name="not_selected" msgid="6610465462668679431">"未揀"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-zh-rTW/strings.xml b/compose/ui/ui/src/androidMain/res/values-zh-rTW/strings.xml
index b833b6b..aa35359 100644
--- a/compose/ui/ui/src/androidMain/res/values-zh-rTW/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-zh-rTW/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"部分檢查"</string>
- <string name="on" msgid="8655164131929253426">"已開啟"</string>
- <string name="off" msgid="875452955155264703">"已關閉"</string>
+ <string name="state_on" msgid="8655164131929253426">"已開啟"</string>
+ <string name="state_off" msgid="875452955155264703">"已關閉"</string>
<string name="switch_role" msgid="2561197295334830845">"切換鈕"</string>
<string name="selected" msgid="6043586758067023">"已選取"</string>
<string name="not_selected" msgid="6610465462668679431">"未選取"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-zu/strings.xml b/compose/ui/ui/src/androidMain/res/values-zu/strings.xml
index d1f80e4..281cf87 100644
--- a/compose/ui/ui/src/androidMain/res/values-zu/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-zu/strings.xml
@@ -18,8 +18,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="indeterminate" msgid="7933458017204019916">"Kuhlolwe kancane"</string>
- <string name="on" msgid="8655164131929253426">"Vuliwe"</string>
- <string name="off" msgid="875452955155264703">"Valiwe"</string>
+ <string name="state_on" msgid="8655164131929253426">"Vuliwe"</string>
+ <string name="state_off" msgid="875452955155264703">"Valiwe"</string>
<string name="switch_role" msgid="2561197295334830845">"Shintsha"</string>
<string name="selected" msgid="6043586758067023">"Okukhethiwe"</string>
<string name="not_selected" msgid="6610465462668679431">"Ayikhethiwe"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values/strings.xml b/compose/ui/ui/src/androidMain/res/values/strings.xml
index 8524e9e..5d955a7 100644
--- a/compose/ui/ui/src/androidMain/res/values/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values/strings.xml
@@ -19,9 +19,9 @@
<!-- Spoken description of indeterminate state of a tri-state checkbox -->
<string name="indeterminate">Partially checked</string>
<!-- Spoken description of on state of a switch -->
- <string name="on">On</string>
+ <string name="state_on">On</string>
<!-- Spoken description of off state of a switch -->
- <string name="off">Off</string>
+ <string name="state_off">Off</string>
<!-- Spoken description naming a Switch Material UI widget -->
<string name="switch_role">Switch</string>
<!-- Spoken description of selected state of a selectable item -->
diff --git a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroidCommandDebouncingTest.kt b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroidCommandDebouncingTest.kt
index f8b8270..19ff239 100644
--- a/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroidCommandDebouncingTest.kt
+++ b/compose/ui/ui/src/androidUnitTest/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroidCommandDebouncingTest.kt
@@ -237,7 +237,7 @@
}
@Test
- fun commandsAreIgnored_ifFocusLostBeforeProcessing() {
+ fun commandsAreNotIgnored_ifFocusLostBeforeProcessing() {
// Send command while view still has focus.
service.showSoftwareKeyboard()
// Blur the view.
@@ -245,7 +245,7 @@
// Process the queued commands.
scope.advanceUntilIdle()
- assertThat(inputMethodManager.showSoftInputCalls).isEqualTo(0)
+ assertThat(inputMethodManager.showSoftInputCalls).isEqualTo(1)
}
@Test
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsProperties.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsProperties.kt
index 0b0e358..e235912 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsProperties.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsProperties.kt
@@ -821,7 +821,7 @@
var SemanticsPropertyReceiver.stateDescription by SemanticsProperties.StateDescription
/**
- * The semantics is represents a range of possible values with a current value.
+ * The semantics represents a range of possible values with a current value.
* For example, when used on a slider control, this will allow screen readers to communicate
* the slider's state.
*/
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/WindowPlacement.desktop.kt.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/WindowPlacement.desktop.kt
similarity index 100%
rename from compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/WindowPlacement.desktop.kt.kt
rename to compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/WindowPlacement.desktop.kt
diff --git a/constraintlayout/constraintlayout/src/main/java/androidx/constraintlayout/widget/ConstraintLayout.java b/constraintlayout/constraintlayout/src/main/java/androidx/constraintlayout/widget/ConstraintLayout.java
index 559636af..d9acf2e 100644
--- a/constraintlayout/constraintlayout/src/main/java/androidx/constraintlayout/widget/ConstraintLayout.java
+++ b/constraintlayout/constraintlayout/src/main/java/androidx/constraintlayout/widget/ConstraintLayout.java
@@ -2514,7 +2514,7 @@
// public int endMargin = UNSET;
// boolean isRtl = false;
- // int layoutDirection = ViewCompat.LAYOUT_DIRECTION_LTR;
+ // int layoutDirection = View.LAYOUT_DIRECTION_LTR;
boolean mWidthSet = true; // need to be set to false when we reactivate this in 3.0
boolean mHeightSet = true; // need to be set to false when we reactivate this in 3.0
diff --git a/coordinatorlayout/coordinatorlayout/src/androidTest/java/androidx/coordinatorlayout/widget/CoordinatorLayoutTest.java b/coordinatorlayout/coordinatorlayout/src/androidTest/java/androidx/coordinatorlayout/widget/CoordinatorLayoutTest.java
index a6f0f11..06a5443 100644
--- a/coordinatorlayout/coordinatorlayout/src/androidTest/java/androidx/coordinatorlayout/widget/CoordinatorLayoutTest.java
+++ b/coordinatorlayout/coordinatorlayout/src/androidTest/java/androidx/coordinatorlayout/widget/CoordinatorLayoutTest.java
@@ -584,7 +584,7 @@
// And assert that it has not been laid out
assertFalse(imageView.getMeasuredWidth() > 0);
assertFalse(imageView.getMeasuredHeight() > 0);
- assertFalse(ViewCompat.isLaidOut(imageView));
+ assertFalse(imageView.isLaidOut());
// Now set the view to INVISIBLE
mActivityTestRule.runOnUiThread(new Runnable() {
@@ -599,7 +599,7 @@
// And assert that it has been laid out
assertTrue(imageView.getMeasuredWidth() > 0);
assertTrue(imageView.getMeasuredHeight() > 0);
- assertTrue(ViewCompat.isLaidOut(imageView));
+ assertTrue(imageView.isLaidOut());
}
@Test
diff --git a/coordinatorlayout/coordinatorlayout/src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java b/coordinatorlayout/coordinatorlayout/src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java
index 70782d1..36c53be 100644
--- a/coordinatorlayout/coordinatorlayout/src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java
+++ b/coordinatorlayout/coordinatorlayout/src/main/java/androidx/coordinatorlayout/widget/CoordinatorLayout.java
@@ -254,10 +254,9 @@
setupForInsets();
super.setOnHierarchyChangeListener(new HierarchyChangeListener());
- if (ViewCompat.getImportantForAccessibility(this)
- == ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
- ViewCompat.setImportantForAccessibility(this,
- ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES);
+ if (this.getImportantForAccessibility()
+ == View.IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
+ setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
}
}
@@ -316,11 +315,11 @@
mStatusBarBackground.setState(getDrawableState());
}
DrawableCompat.setLayoutDirection(mStatusBarBackground,
- ViewCompat.getLayoutDirection(this));
+ getLayoutDirection());
mStatusBarBackground.setVisible(getVisibility() == VISIBLE, false);
mStatusBarBackground.setCallback(this);
}
- ViewCompat.postInvalidateOnAnimation(this);
+ postInvalidateOnAnimation();
}
}
@@ -816,8 +815,8 @@
final int paddingTop = getPaddingTop();
final int paddingRight = getPaddingRight();
final int paddingBottom = getPaddingBottom();
- final int layoutDirection = ViewCompat.getLayoutDirection(this);
- final boolean isRtl = layoutDirection == ViewCompat.LAYOUT_DIRECTION_RTL;
+ final int layoutDirection = getLayoutDirection();
+ final boolean isRtl = layoutDirection == View.LAYOUT_DIRECTION_RTL;
final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
final int widthSize = MeasureSpec.getSize(widthMeasureSpec);
final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
@@ -948,7 +947,7 @@
@Override
@SuppressWarnings("unchecked")
protected void onLayout(boolean changed, int l, int t, int r, int b) {
- final int layoutDirection = ViewCompat.getLayoutDirection(this);
+ final int layoutDirection = getLayoutDirection();
final int childCount = mDependencySortedChildren.size();
for (int i = 0; i < childCount; i++) {
final View child = mDependencySortedChildren.get(i);
@@ -1183,7 +1182,7 @@
final int childWidth = child.getMeasuredWidth();
final int childHeight = child.getMeasuredHeight();
- if (layoutDirection == ViewCompat.LAYOUT_DIRECTION_RTL) {
+ if (layoutDirection == View.LAYOUT_DIRECTION_RTL) {
keyline = width - keyline;
}
@@ -1349,7 +1348,7 @@
*/
@SuppressWarnings("unchecked")
final void onChildViewsChanged(@DispatchChangeEvent final int type) {
- final int layoutDirection = ViewCompat.getLayoutDirection(this);
+ final int layoutDirection = getLayoutDirection();
final int childCount = mDependencySortedChildren.size();
final Rect inset = acquireTempRect();
final Rect drawRect = acquireTempRect();
@@ -1455,7 +1454,7 @@
@SuppressWarnings("unchecked")
private void offsetChildByInset(final View child, final Rect inset, final int layoutDirection) {
- if (!ViewCompat.isLaidOut(child)) {
+ if (!child.isLaidOut()) {
// The view has not been laid out yet, so we can't obtain its bounds.
return;
}
@@ -3304,7 +3303,7 @@
@SuppressWarnings("unchecked")
boolean dependsOn(CoordinatorLayout parent, View child, View dependency) {
return dependency == mAnchorDirectChild
- || shouldDodge(dependency, ViewCompat.getLayoutDirection(parent))
+ || shouldDodge(dependency, parent.getLayoutDirection())
|| (mBehavior != null && mBehavior.layoutDependsOn(parent, child, dependency));
}
diff --git a/core/core/api/current.txt b/core/core/api/current.txt
index c23fc66..d7001c1 100644
--- a/core/core/api/current.txt
+++ b/core/core/api/current.txt
@@ -3135,10 +3135,10 @@
field @Deprecated public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
field @Deprecated public static final int LAYER_TYPE_NONE = 0; // 0x0
field @Deprecated public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
- field public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
- field public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
- field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
- field public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
+ field @Deprecated public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
+ field @Deprecated public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
+ field @Deprecated public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
+ field @Deprecated public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
field @Deprecated public static final int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
field @Deprecated public static final int MEASURED_SIZE_MASK = 16777215; // 0xffffff
field @Deprecated public static final int MEASURED_STATE_MASK = -16777216; // 0xff000000
@@ -4141,9 +4141,9 @@
method public void scrollTargetBy(int, int);
}
- public final class ListViewCompat {
- method public static boolean canScrollList(android.widget.ListView, int);
- method public static void scrollListBy(android.widget.ListView, int);
+ @Deprecated public final class ListViewCompat {
+ method @Deprecated public static boolean canScrollList(android.widget.ListView, int);
+ method @Deprecated public static void scrollListBy(android.widget.ListView, int);
}
public class NestedScrollView extends android.widget.FrameLayout implements androidx.core.view.NestedScrollingChild3 androidx.core.view.NestedScrollingParent3 androidx.core.view.ScrollingView {
diff --git a/core/core/api/restricted_current.txt b/core/core/api/restricted_current.txt
index de4c9db..b75e2bb 100644
--- a/core/core/api/restricted_current.txt
+++ b/core/core/api/restricted_current.txt
@@ -3588,10 +3588,10 @@
field @Deprecated public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
field @Deprecated public static final int LAYER_TYPE_NONE = 0; // 0x0
field @Deprecated public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
- field public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
- field public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
- field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
- field public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
+ field @Deprecated public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
+ field @Deprecated public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
+ field @Deprecated public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
+ field @Deprecated public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
field @Deprecated public static final int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
field @Deprecated public static final int MEASURED_SIZE_MASK = 16777215; // 0xffffff
field @Deprecated public static final int MEASURED_STATE_MASK = -16777216; // 0xff000000
@@ -4643,9 +4643,9 @@
method public void scrollTargetBy(int, int);
}
- public final class ListViewCompat {
- method public static boolean canScrollList(android.widget.ListView, int);
- method public static void scrollListBy(android.widget.ListView, int);
+ @Deprecated public final class ListViewCompat {
+ method @Deprecated public static boolean canScrollList(android.widget.ListView, int);
+ method @Deprecated public static void scrollListBy(android.widget.ListView, int);
}
public class NestedScrollView extends android.widget.FrameLayout implements androidx.core.view.NestedScrollingChild3 androidx.core.view.NestedScrollingParent3 androidx.core.view.ScrollingView {
diff --git a/core/core/src/androidTest/java/androidx/core/util/TypedValueCompatTest.kt b/core/core/src/androidTest/java/androidx/core/util/TypedValueCompatTest.kt
index 9ac42ad..f77e242 100644
--- a/core/core/src/androidTest/java/androidx/core/util/TypedValueCompatTest.kt
+++ b/core/core/src/androidTest/java/androidx/core/util/TypedValueCompatTest.kt
@@ -27,6 +27,7 @@
import org.junit.runner.RunWith
import org.mockito.Mockito.mock
+@Suppress("DEPRECATION") // for DisplayMetrics.scaledDensity
@RunWith(AndroidJUnit4::class)
@SmallTest
class TypedValueCompatTest {
diff --git a/core/core/src/androidTest/java/androidx/core/view/AccessibilityDelegateCompatTest.java b/core/core/src/androidTest/java/androidx/core/view/AccessibilityDelegateCompatTest.java
index 67209d2..7dd5bc8 100644
--- a/core/core/src/androidTest/java/androidx/core/view/AccessibilityDelegateCompatTest.java
+++ b/core/core/src/androidTest/java/androidx/core/view/AccessibilityDelegateCompatTest.java
@@ -96,7 +96,7 @@
// Use a group, so it has a child
mView = (ViewGroup) activity.findViewById(androidx.core.test.R.id.view).getParent();
// On KitKat, some delegate methods aren't called for non-important views
- ViewCompat.setImportantForAccessibility(mView, View.IMPORTANT_FOR_ACCESSIBILITY_YES);
+ mView.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
});
}
@@ -173,8 +173,7 @@
final AccessibilityDelegateCompat mockDelegate = mock(
AccessibilityDelegateCompat.class);
mActivityTestRule.runOnUiThread(() -> {
- ViewCompat.setAccessibilityLiveRegion(mView,
- ViewCompat.ACCESSIBILITY_LIVE_REGION_POLITE);
+ mView.setAccessibilityLiveRegion(View.ACCESSIBILITY_LIVE_REGION_POLITE);
ViewCompat.setAccessibilityPaneTitle(mView, "Sample title");
@@ -243,8 +242,7 @@
mActivityTestRule.runOnUiThread(() -> {
mChildView = activity.findViewById(androidx.core.test.R.id.view);
// On KitKat, some delegate methods aren't called for non-important views
- ViewCompat.setImportantForAccessibility(mChildView,
- View.IMPORTANT_FOR_ACCESSIBILITY_YES);
+ mChildView.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
});
final CharSequence title = "Sample title";
ViewCompat.setAccessibilityPaneTitle(mChildView, title);
@@ -301,15 +299,14 @@
mActivityTestRule.runOnUiThread(() -> {
mChildView = activity.findViewById(androidx.core.test.R.id.view);
// On KitKat, some delegate methods aren't called for non-important views
- ViewCompat.setImportantForAccessibility(mChildView,
- View.IMPORTANT_FOR_ACCESSIBILITY_YES);
+ mChildView.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
});
final CharSequence title = "Sample title";
ViewCompat.setAccessibilityPaneTitle(mChildView, title);
// Validity check
- assertEquals(ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES,
- ViewCompat.getImportantForAccessibility(mChildView));
+ assertEquals(View.IMPORTANT_FOR_ACCESSIBILITY_YES,
+ mChildView.getImportantForAccessibility());
assertEquals(mChildView.getVisibility(), View.VISIBLE);
sUiAutomation.executeAndWaitForEvent(
@@ -351,8 +348,8 @@
ViewCompat.setAccessibilityPaneTitle(mView, title);
// Validity check
- assertEquals(ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES,
- ViewCompat.getImportantForAccessibility(mView));
+ assertEquals(View.IMPORTANT_FOR_ACCESSIBILITY_YES,
+ mView.getImportantForAccessibility());
final Activity activity = mActivityTestRule.getActivity();
sUiAutomation.executeAndWaitForEvent(
@@ -426,7 +423,7 @@
int actionId = integerArgumentCaptor.getValue();
//The service would end up calling the same thing ViewCompat calls
- ViewCompat.performAccessibilityAction(mView, actionId, args);
+ mView.performAccessibilityAction(actionId, args);
verify(span2).onClick(mView);
}
@@ -475,7 +472,7 @@
public void testAccessibilityActionPerformIsCalled() {
final AccessibilityViewCommand action = mock(AccessibilityViewCommand.class);
final int id = ViewCompat.addAccessibilityAction(mView, "Asad's action", action);
- ViewCompat.performAccessibilityAction(mView, id, null);
+ mView.performAccessibilityAction(id, null);
verify(action).perform(mView, null);
}
@@ -487,7 +484,7 @@
AccessibilityViewCommand action = mock(AccessibilityViewCommand.class);
final int id = ViewCompat.addAccessibilityAction(mView,
"Test" + Integer.valueOf(i).toString(), action);
- ViewCompat.performAccessibilityAction(mView, id, null);
+ mView.performAccessibilityAction(id, null);
verify(action).perform(mView, null);
actionIdToBeRemoved = id;
}
@@ -495,7 +492,7 @@
AccessibilityViewCommand action = mock(AccessibilityViewCommand.class);
final int id = ViewCompat.addAccessibilityAction(mView, "Last test", action);
- ViewCompat.performAccessibilityAction(mView, id, null);
+ mView.performAccessibilityAction(id, null);
verify(action).perform(mView, null);
}
@@ -507,8 +504,7 @@
ViewCompat.replaceAccessibilityAction(mView, AccessibilityActionCompat.ACTION_FOCUS,
"Focus title", action);
- ViewCompat.performAccessibilityAction(mView,
- AccessibilityNodeInfoCompat.ACTION_FOCUS, null);
+ mView.performAccessibilityAction(AccessibilityNodeInfoCompat.ACTION_FOCUS, null);
verify(action).perform(mView, null);
}
@@ -525,8 +521,7 @@
ViewCompat.replaceAccessibilityAction(mView, AccessibilityActionCompat.ACTION_FOCUS,
expectedLabel, action2);
- ViewCompat.performAccessibilityAction(mView,
- AccessibilityNodeInfoCompat.ACTION_FOCUS, null);
+ mView.performAccessibilityAction(AccessibilityNodeInfoCompat.ACTION_FOCUS, null);
verify(action2).perform(mView, null);
verify(action, never()).perform(mView, null);
}
@@ -561,7 +556,7 @@
final boolean extendSelection = true;
bundle.putBoolean(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN,
extendSelection);
- ViewCompat.performAccessibilityAction(mView,
+ mView.performAccessibilityAction(
AccessibilityNodeInfoCompat.ACTION_NEXT_AT_MOVEMENT_GRANULARITY, bundle);
AccessibilityViewCommand.MoveAtGranularityArguments args =
new AccessibilityViewCommand.MoveAtGranularityArguments();
@@ -577,23 +572,23 @@
@Test
@SdkSuppress(minSdkVersion = 21)
public void testSetAccessibilityDelegate_viewAutoImportant_makesViewImportant() {
- ViewCompat.setImportantForAccessibility(mView, ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_AUTO);
+ mView.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_AUTO);
assertThat(mView.getImportantForAccessibility()).isEqualTo(
- ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_AUTO);
+ View.IMPORTANT_FOR_ACCESSIBILITY_AUTO);
ViewCompat.setAccessibilityDelegate(mView, new AccessibilityDelegateCompat());
assertThat(mView.getImportantForAccessibility()).isEqualTo(
- ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES);
+ View.IMPORTANT_FOR_ACCESSIBILITY_YES);
}
@SdkSuppress(minSdkVersion = 21)
@Test
public void testSetAccessibilityDelegate_viewUnimportant_doesNotMakeViewImportant() {
- ViewCompat.setImportantForAccessibility(mView, ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO);
+ mView.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO);
Truth.assertThat(mView.getImportantForAccessibility()).isEqualTo(
- ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO);
+ View.IMPORTANT_FOR_ACCESSIBILITY_NO);
ViewCompat.setAccessibilityDelegate(mView, new AccessibilityDelegateCompat());
Truth.assertThat(mView.getImportantForAccessibility()).isEqualTo(
- ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO);
+ View.IMPORTANT_FOR_ACCESSIBILITY_NO);
}
@Test
diff --git a/core/core/src/androidTest/java/androidx/core/view/GravityCompatTest.java b/core/core/src/androidTest/java/androidx/core/view/GravityCompatTest.java
index a3adf6a..e202a19 100644
--- a/core/core/src/androidTest/java/androidx/core/view/GravityCompatTest.java
+++ b/core/core/src/androidTest/java/androidx/core/view/GravityCompatTest.java
@@ -21,6 +21,7 @@
import android.os.Build;
import android.support.v4.testutils.TestUtils;
import android.view.Gravity;
+import android.view.View;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
@@ -42,46 +43,46 @@
@Test
public void testGetAbsoluteGravity() {
assertEquals("Left under LTR",
- GravityCompat.getAbsoluteGravity(Gravity.LEFT, ViewCompat.LAYOUT_DIRECTION_LTR),
+ GravityCompat.getAbsoluteGravity(Gravity.LEFT, View.LAYOUT_DIRECTION_LTR),
Gravity.LEFT);
assertEquals("Right under LTR",
- GravityCompat.getAbsoluteGravity(Gravity.RIGHT, ViewCompat.LAYOUT_DIRECTION_LTR),
+ GravityCompat.getAbsoluteGravity(Gravity.RIGHT, View.LAYOUT_DIRECTION_LTR),
Gravity.RIGHT);
assertEquals("Left under RTL",
- GravityCompat.getAbsoluteGravity(Gravity.LEFT, ViewCompat.LAYOUT_DIRECTION_RTL),
+ GravityCompat.getAbsoluteGravity(Gravity.LEFT, View.LAYOUT_DIRECTION_RTL),
Gravity.LEFT);
assertEquals("Right under RTL",
- GravityCompat.getAbsoluteGravity(Gravity.RIGHT, ViewCompat.LAYOUT_DIRECTION_RTL),
+ GravityCompat.getAbsoluteGravity(Gravity.RIGHT, View.LAYOUT_DIRECTION_RTL),
Gravity.RIGHT);
assertEquals("Start under LTR",
GravityCompat.getAbsoluteGravity(GravityCompat.START,
- ViewCompat.LAYOUT_DIRECTION_LTR),
+ View.LAYOUT_DIRECTION_LTR),
Gravity.LEFT);
assertEquals("End under LTR",
GravityCompat.getAbsoluteGravity(GravityCompat.END,
- ViewCompat.LAYOUT_DIRECTION_LTR),
+ View.LAYOUT_DIRECTION_LTR),
Gravity.RIGHT);
if (Build.VERSION.SDK_INT >= 17) {
// The following tests are only expected to pass on v17+ devices
assertEquals("Start under RTL",
GravityCompat.getAbsoluteGravity(GravityCompat.START,
- ViewCompat.LAYOUT_DIRECTION_RTL),
+ View.LAYOUT_DIRECTION_RTL),
Gravity.RIGHT);
assertEquals("End under RTL",
GravityCompat.getAbsoluteGravity(GravityCompat.END,
- ViewCompat.LAYOUT_DIRECTION_RTL),
+ View.LAYOUT_DIRECTION_RTL),
Gravity.LEFT);
} else {
// And on older devices START is always LEFT, END is always RIGHT
assertEquals("Start under RTL",
GravityCompat.getAbsoluteGravity(GravityCompat.START,
- ViewCompat.LAYOUT_DIRECTION_RTL),
+ View.LAYOUT_DIRECTION_RTL),
Gravity.LEFT);
assertEquals("End under RTL",
GravityCompat.getAbsoluteGravity(GravityCompat.END,
- ViewCompat.LAYOUT_DIRECTION_RTL),
+ View.LAYOUT_DIRECTION_RTL),
Gravity.RIGHT);
}
}
@@ -92,55 +93,55 @@
// Left / top aligned under LTR direction
GravityCompat.apply(Gravity.LEFT | Gravity.TOP, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_LTR);
TestUtils.assertRectangleBounds("Left / top aligned under LTR: ",
outRect, 0, 0, 100, 50);
// Center / top aligned under LTR direction
GravityCompat.apply(Gravity.CENTER_HORIZONTAL | Gravity.TOP, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_LTR);
TestUtils.assertRectangleBounds("Center / top aligned under LTR: ",
outRect, 50, 0, 150, 50);
// Right / top aligned under LTR direction
GravityCompat.apply(Gravity.RIGHT | Gravity.TOP, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_LTR);
TestUtils.assertRectangleBounds("Right / top aligned under LTR: ",
outRect, 100, 0, 200, 50);
// Left / center aligned under LTR direction
GravityCompat.apply(Gravity.LEFT | Gravity.CENTER_VERTICAL, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_LTR);
TestUtils.assertRectangleBounds("Left / center aligned under LTR: ",
outRect, 0, 25, 100, 75);
// Center / center aligned under LTR direction
GravityCompat.apply(Gravity.CENTER, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_LTR);
TestUtils.assertRectangleBounds("Center / center aligned under LTR: ",
outRect, 50, 25, 150, 75);
// Right / center aligned under LTR direction
GravityCompat.apply(Gravity.RIGHT | Gravity.CENTER_VERTICAL, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_LTR);
TestUtils.assertRectangleBounds("Right / center aligned under LTR: ",
outRect, 100, 25, 200, 75);
// Left / bottom aligned under LTR direction
GravityCompat.apply(Gravity.LEFT | Gravity.BOTTOM, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_LTR);
TestUtils.assertRectangleBounds("Left / bottom aligned under LTR: ",
outRect, 0, 50, 100, 100);
// Center / bottom aligned under LTR direction
GravityCompat.apply(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_LTR);
TestUtils.assertRectangleBounds("Center / bottom aligned under LTR: ",
outRect, 50, 50, 150, 100);
// Right / bottom aligned under LTR direction
GravityCompat.apply(Gravity.RIGHT | Gravity.BOTTOM, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_LTR);
TestUtils.assertRectangleBounds("Right / bottom aligned under LTR: ",
outRect, 100, 50, 200, 100);
@@ -149,37 +150,37 @@
// Start / top aligned under LTR direction
GravityCompat.apply(GravityCompat.START | Gravity.TOP, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_LTR);
TestUtils.assertRectangleBounds("Start / top aligned under LTR: ",
outRect, 0, 0, 100, 50);
// End / top aligned under LTR direction
GravityCompat.apply(GravityCompat.END | Gravity.TOP, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_LTR);
TestUtils.assertRectangleBounds("End / top aligned under LTR: ",
outRect, 100, 0, 200, 50);
// Start / center aligned under LTR direction
GravityCompat.apply(GravityCompat.START | Gravity.CENTER_VERTICAL, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_LTR);
TestUtils.assertRectangleBounds("Start / center aligned under LTR: ",
outRect, 0, 25, 100, 75);
// End / center aligned under LTR direction
GravityCompat.apply(GravityCompat.END | Gravity.CENTER_VERTICAL, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_LTR);
TestUtils.assertRectangleBounds("End / center aligned under LTR: ",
outRect, 100, 25, 200, 75);
// Start / bottom aligned under LTR direction
GravityCompat.apply(GravityCompat.START | Gravity.BOTTOM, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_LTR);
TestUtils.assertRectangleBounds("Start / bottom aligned under LTR: ",
outRect, 0, 50, 100, 100);
// End / bottom aligned under LTR direction
GravityCompat.apply(GravityCompat.END | Gravity.BOTTOM, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_LTR);
TestUtils.assertRectangleBounds("End / bottom aligned under LTR: ",
outRect, 100, 50, 200, 100);
}
@@ -193,55 +194,55 @@
// Left / top aligned under RTL direction
GravityCompat.apply(Gravity.LEFT | Gravity.TOP, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("Left / top aligned under RTL: ",
outRect, 0, 0, 100, 50);
// Center / top aligned under RTL direction
GravityCompat.apply(Gravity.CENTER_HORIZONTAL | Gravity.TOP, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("Center / top aligned under RTL: ",
outRect, 50, 0, 150, 50);
// Right / top aligned under RTL direction
GravityCompat.apply(Gravity.RIGHT | Gravity.TOP, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("Right / top aligned under RTL: ",
outRect, 100, 0, 200, 50);
// Left / center aligned under RTL direction
GravityCompat.apply(Gravity.LEFT | Gravity.CENTER_VERTICAL, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("Left / center aligned under RTL: ",
outRect, 0, 25, 100, 75);
// Center / center aligned under RTL direction
GravityCompat.apply(Gravity.CENTER, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("Center / center aligned under RTL: ",
outRect, 50, 25, 150, 75);
// Right / center aligned under RTL direction
GravityCompat.apply(Gravity.RIGHT | Gravity.CENTER_VERTICAL, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("Right / center aligned under RTL: ",
outRect, 100, 25, 200, 75);
// Left / bottom aligned under RTL direction
GravityCompat.apply(Gravity.LEFT | Gravity.BOTTOM, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("Left / bottom aligned under RTL: ",
outRect, 0, 50, 100, 100);
// Center / bottom aligned under RTL direction
GravityCompat.apply(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("Center / bottom aligned under RTL: ",
outRect, 50, 50, 150, 100);
// Right / bottom aligned under RTL direction
GravityCompat.apply(Gravity.RIGHT | Gravity.BOTTOM, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("Right / bottom aligned under RTL: ",
outRect, 100, 50, 200, 100);
@@ -252,37 +253,37 @@
// Start / top aligned under RTL direction
GravityCompat.apply(GravityCompat.START | Gravity.TOP, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("Start / top aligned under RTL: ",
outRect, 100, 0, 200, 50);
// End / top aligned under RTL direction
GravityCompat.apply(GravityCompat.END | Gravity.TOP, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("End / top aligned under RTL: ",
outRect, 0, 0, 100, 50);
// Start / center aligned under RTL direction
GravityCompat.apply(GravityCompat.START | Gravity.CENTER_VERTICAL, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("Start / center aligned under RTL: ",
outRect, 100, 25, 200, 75);
// End / center aligned under RTL direction
GravityCompat.apply(GravityCompat.END | Gravity.CENTER_VERTICAL, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("End / center aligned under RTL: ",
outRect, 0, 25, 100, 75);
// Start / bottom aligned under RTL direction
GravityCompat.apply(GravityCompat.START | Gravity.BOTTOM, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("Start / bottom aligned under RTL: ",
outRect, 100, 50, 200, 100);
// End / bottom aligned under RTL direction
GravityCompat.apply(GravityCompat.END | Gravity.BOTTOM, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("End / bottom aligned under RTL: ",
outRect, 0, 50, 100, 100);
} else {
@@ -290,37 +291,37 @@
// Start / top aligned under RTL direction
GravityCompat.apply(GravityCompat.START | Gravity.TOP, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("Start / top aligned under RTL: ",
outRect, 0, 0, 100, 50);
// End / top aligned under RTL direction
GravityCompat.apply(GravityCompat.END | Gravity.TOP, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("End / top aligned under RTL: ",
outRect, 100, 0, 200, 50);
// Start / center aligned under RTL direction
GravityCompat.apply(GravityCompat.START | Gravity.CENTER_VERTICAL, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("Start / center aligned under RTL: ",
outRect, 0, 25, 100, 75);
// End / center aligned under RTL direction
GravityCompat.apply(GravityCompat.END | Gravity.CENTER_VERTICAL, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("End / center aligned under RTL: ",
outRect, 100, 25, 200, 75);
// Start / bottom aligned under RTL direction
GravityCompat.apply(GravityCompat.START | Gravity.BOTTOM, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("Start / bottom aligned under RTL: ",
outRect, 0, 50, 100, 100);
// End / bottom aligned under RTL direction
GravityCompat.apply(GravityCompat.END | Gravity.BOTTOM, 100, 50,
- new Rect(0, 0, 200, 100), outRect, ViewCompat.LAYOUT_DIRECTION_RTL);
+ new Rect(0, 0, 200, 100), outRect, View.LAYOUT_DIRECTION_RTL);
TestUtils.assertRectangleBounds("End / bottom aligned under RTL: ",
outRect, 100, 50, 200, 100);
}
diff --git a/core/core/src/androidTest/java/androidx/core/view/MarginLayoutParamsCompatTest.java b/core/core/src/androidTest/java/androidx/core/view/MarginLayoutParamsCompatTest.java
index 7289810..22971c9 100644
--- a/core/core/src/androidTest/java/androidx/core/view/MarginLayoutParamsCompatTest.java
+++ b/core/core/src/androidTest/java/androidx/core/view/MarginLayoutParamsCompatTest.java
@@ -18,6 +18,7 @@
import static org.junit.Assert.assertEquals;
import android.os.Build;
+import android.view.View;
import android.view.ViewGroup;
import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -33,15 +34,15 @@
public void testLayoutDirection() {
ViewGroup.MarginLayoutParams mlp = new ViewGroup.MarginLayoutParams(0, 0);
- assertEquals("Default LTR layout direction", ViewCompat.LAYOUT_DIRECTION_LTR,
+ assertEquals("Default LTR layout direction", View.LAYOUT_DIRECTION_LTR,
MarginLayoutParamsCompat.getLayoutDirection(mlp));
- MarginLayoutParamsCompat.setLayoutDirection(mlp, ViewCompat.LAYOUT_DIRECTION_RTL);
- assertEquals("RTL layout direction", ViewCompat.LAYOUT_DIRECTION_RTL,
+ MarginLayoutParamsCompat.setLayoutDirection(mlp, View.LAYOUT_DIRECTION_RTL);
+ assertEquals("RTL layout direction", View.LAYOUT_DIRECTION_RTL,
MarginLayoutParamsCompat.getLayoutDirection(mlp));
- MarginLayoutParamsCompat.setLayoutDirection(mlp, ViewCompat.LAYOUT_DIRECTION_LTR);
- assertEquals("Back to LTR layout direction", ViewCompat.LAYOUT_DIRECTION_LTR,
+ MarginLayoutParamsCompat.setLayoutDirection(mlp, View.LAYOUT_DIRECTION_LTR);
+ assertEquals("Back to LTR layout direction", View.LAYOUT_DIRECTION_LTR,
MarginLayoutParamsCompat.getLayoutDirection(mlp));
}
@@ -65,7 +66,7 @@
mlp.leftMargin = 50;
mlp.rightMargin = 80;
- MarginLayoutParamsCompat.setLayoutDirection(mlp, ViewCompat.LAYOUT_DIRECTION_RTL);
+ MarginLayoutParamsCompat.setLayoutDirection(mlp, View.LAYOUT_DIRECTION_RTL);
if (Build.VERSION.SDK_INT >= 17) {
assertEquals("Mapping right to start under RTL", 80,
@@ -107,7 +108,7 @@
// to do platform-specific checks, the checks in this test are platform-agnostic,
// relying on the relevant MarginLayoutParamsCompat to do the right mapping internally.
- MarginLayoutParamsCompat.setLayoutDirection(mlp, ViewCompat.LAYOUT_DIRECTION_RTL);
+ MarginLayoutParamsCompat.setLayoutDirection(mlp, View.LAYOUT_DIRECTION_RTL);
MarginLayoutParamsCompat.setMarginStart(mlp, 50);
assertEquals("Resolved start margin under RTL", 50,
@@ -129,7 +130,7 @@
ViewGroup.MarginLayoutParams mlp = new ViewGroup.MarginLayoutParams(0, 0);
MarginLayoutParamsCompat.setMarginStart(mlp, 50);
- MarginLayoutParamsCompat.resolveLayoutDirection(mlp, ViewCompat.LAYOUT_DIRECTION_LTR);
+ MarginLayoutParamsCompat.resolveLayoutDirection(mlp, View.LAYOUT_DIRECTION_LTR);
// While there's no guarantee that left/right margin fields have been set / resolved
// prior to the resolveLayoutDirection call, they should be now
@@ -137,7 +138,7 @@
assertEquals("Default right margin field under LTR", 0, mlp.rightMargin);
MarginLayoutParamsCompat.setMarginEnd(mlp, 80);
- MarginLayoutParamsCompat.resolveLayoutDirection(mlp, ViewCompat.LAYOUT_DIRECTION_LTR);
+ MarginLayoutParamsCompat.resolveLayoutDirection(mlp, View.LAYOUT_DIRECTION_LTR);
assertEquals("Resolved right margin field under LTR", 80, mlp.rightMargin);
assertEquals("Keeping left margin field under LTR", 50, mlp.leftMargin);
@@ -148,7 +149,7 @@
ViewGroup.MarginLayoutParams mlp = new ViewGroup.MarginLayoutParams(0, 0);
MarginLayoutParamsCompat.setMarginStart(mlp, 50);
- MarginLayoutParamsCompat.resolveLayoutDirection(mlp, ViewCompat.LAYOUT_DIRECTION_RTL);
+ MarginLayoutParamsCompat.resolveLayoutDirection(mlp, View.LAYOUT_DIRECTION_RTL);
// While there's no guarantee that left/right margin fields have been set / resolved
// prior to the resolveLayoutDirection call, they should be now
@@ -163,7 +164,7 @@
}
MarginLayoutParamsCompat.setMarginEnd(mlp, 80);
- MarginLayoutParamsCompat.resolveLayoutDirection(mlp, ViewCompat.LAYOUT_DIRECTION_RTL);
+ MarginLayoutParamsCompat.resolveLayoutDirection(mlp, View.LAYOUT_DIRECTION_RTL);
if (Build.VERSION.SDK_INT >= 17) {
assertEquals("Resolved left margin field under RTL", 80, mlp.leftMargin);
diff --git a/core/core/src/androidTest/java/androidx/core/view/ViewCompatTest.java b/core/core/src/androidTest/java/androidx/core/view/ViewCompatTest.java
index a27a4e2..540d286 100644
--- a/core/core/src/androidTest/java/androidx/core/view/ViewCompatTest.java
+++ b/core/core/src/androidTest/java/androidx/core/view/ViewCompatTest.java
@@ -108,8 +108,8 @@
public void testConstants() {
// Compat constants must match core constants since they can be used interchangeably
// in various support lib calls.
- assertEquals("LTR constants", View.LAYOUT_DIRECTION_LTR, ViewCompat.LAYOUT_DIRECTION_LTR);
- assertEquals("RTL constants", View.LAYOUT_DIRECTION_RTL, ViewCompat.LAYOUT_DIRECTION_RTL);
+ assertEquals("LTR constants", View.LAYOUT_DIRECTION_LTR, View.LAYOUT_DIRECTION_LTR);
+ assertEquals("RTL constants", View.LAYOUT_DIRECTION_RTL, View.LAYOUT_DIRECTION_RTL);
}
@Test
@@ -252,7 +252,7 @@
Set<Integer> generatedIds = new HashSet<>();
for (int i = 0; i < requestCount; i++) {
- int generatedId = ViewCompat.generateViewId();
+ int generatedId = View.generateViewId();
assertTrue(isViewIdGenerated(generatedId));
generatedIds.add(generatedId);
}
@@ -329,7 +329,7 @@
Bundle bundle = new Bundle();
bundle.putInt(ACTION_ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT, 100);
- ViewCompat.performAccessibilityAction(view, actionCompat.getId(), bundle);
+ view.performAccessibilityAction(actionCompat.getId(), bundle);
ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
verify(view).performAccessibilityAction(eq(actionCompat.getId()), bundleCaptor.capture());
diff --git a/core/core/src/androidTest/java/androidx/core/view/ViewGroupCompatTest.java b/core/core/src/androidTest/java/androidx/core/view/ViewGroupCompatTest.java
index a0054a2..7503c47 100644
--- a/core/core/src/androidTest/java/androidx/core/view/ViewGroupCompatTest.java
+++ b/core/core/src/androidTest/java/androidx/core/view/ViewGroupCompatTest.java
@@ -57,7 +57,7 @@
InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
- ViewCompat.setBackground(mViewGroup, new ColorDrawable(Color.GRAY));
+ mViewGroup.setBackground(new ColorDrawable(Color.GRAY));
}
});
assertTrue(ViewGroupCompat.isTransitionGroup(mViewGroup));
diff --git a/core/core/src/androidTest/java/androidx/core/widget/ListViewCompatTest.java b/core/core/src/androidTest/java/androidx/core/widget/ListViewCompatTest.java
index 313f431..0d4afc2 100644
--- a/core/core/src/androidTest/java/androidx/core/widget/ListViewCompatTest.java
+++ b/core/core/src/androidTest/java/androidx/core/widget/ListViewCompatTest.java
@@ -42,6 +42,7 @@
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
+@SuppressWarnings("deprecation")
@MediumTest
public class ListViewCompatTest extends BaseInstrumentationTestCase<ListViewTestActivity> {
private ListView mListView;
diff --git a/core/core/src/androidTest/java/androidx/core/widget/NestedScrollViewNestedScrollingA11yScrollTest.java b/core/core/src/androidTest/java/androidx/core/widget/NestedScrollViewNestedScrollingA11yScrollTest.java
index 3009db1..27ca404 100644
--- a/core/core/src/androidTest/java/androidx/core/widget/NestedScrollViewNestedScrollingA11yScrollTest.java
+++ b/core/core/src/androidTest/java/androidx/core/widget/NestedScrollViewNestedScrollingA11yScrollTest.java
@@ -186,7 +186,7 @@
}
});
- ViewCompat.performAccessibilityAction(mNestedScrollView, action, null);
+ mNestedScrollView.performAccessibilityAction(action, null);
}
});
assertThat(countDownLatch.await(2, TimeUnit.SECONDS), is(true));
diff --git a/core/core/src/androidTest/java/androidx/core/widget/TextViewCompatTest.java b/core/core/src/androidTest/java/androidx/core/widget/TextViewCompatTest.java
index d0edce2..b175c96 100644
--- a/core/core/src/androidTest/java/androidx/core/widget/TextViewCompatTest.java
+++ b/core/core/src/androidTest/java/androidx/core/widget/TextViewCompatTest.java
@@ -62,7 +62,6 @@
import androidx.appcompat.view.menu.MenuBuilder;
import androidx.core.test.R;
import androidx.core.text.PrecomputedTextCompat;
-import androidx.core.view.ViewCompat;
import androidx.test.annotation.UiThreadTest;
import androidx.test.filters.LargeTest;
import androidx.test.filters.SdkSuppress;
@@ -205,7 +204,7 @@
@Test
public void testCompoundDrawablesRelativeRtl() throws Throwable {
- onView(withId(R.id.text_view)).perform(setLayoutDirection(ViewCompat.LAYOUT_DIRECTION_RTL));
+ onView(withId(R.id.text_view)).perform(setLayoutDirection(View.LAYOUT_DIRECTION_RTL));
final Drawable drawableStart = new ColorDrawable(0xFFFF0000);
drawableStart.setBounds(0, 0, 20, 20);
@@ -219,7 +218,7 @@
drawableTop, drawableEnd, null));
// Check to see whether our text view is under RTL mode
- if (ViewCompat.getLayoutDirection(mTextView) != ViewCompat.LAYOUT_DIRECTION_RTL) {
+ if (mTextView.getLayoutDirection() != View.LAYOUT_DIRECTION_RTL) {
// This will happen on v17- devices
return;
}
@@ -284,7 +283,7 @@
@Test
public void testCompoundDrawablesRelativeWithIntrinsicBoundsRtl() throws Throwable {
- onView(withId(R.id.text_view)).perform(setLayoutDirection(ViewCompat.LAYOUT_DIRECTION_RTL));
+ onView(withId(R.id.text_view)).perform(setLayoutDirection(View.LAYOUT_DIRECTION_RTL));
final Drawable drawableStart = new TestDrawable(0xFFFF0000, 30, 20);
final Drawable drawableEnd = new TestDrawable(0xFF0000FF, 25, 45);
@@ -295,7 +294,7 @@
drawableStart, null, drawableEnd, drawableBottom));
// Check to see whether our text view is under RTL mode
- if (ViewCompat.getLayoutDirection(mTextView) != ViewCompat.LAYOUT_DIRECTION_RTL) {
+ if (mTextView.getLayoutDirection() != View.LAYOUT_DIRECTION_RTL) {
// This will happen on v17- devices
return;
}
@@ -370,7 +369,7 @@
@Test
public void testCompoundDrawablesRelativeWithIntrinsicBoundsByIdRtl() throws Throwable {
- onView(withId(R.id.text_view)).perform(setLayoutDirection(ViewCompat.LAYOUT_DIRECTION_RTL));
+ onView(withId(R.id.text_view)).perform(setLayoutDirection(View.LAYOUT_DIRECTION_RTL));
onView(withId(R.id.text_view)).perform(setText(R.string.test_text_long));
onView(withId(R.id.text_view)).perform(setCompoundDrawablesRelativeWithIntrinsicBounds(
@@ -378,7 +377,7 @@
R.drawable.test_drawable_green, R.drawable.test_drawable_blue));
// Check to see whether our text view is under RTL mode
- if (ViewCompat.getLayoutDirection(mTextView) != ViewCompat.LAYOUT_DIRECTION_RTL) {
+ if (mTextView.getLayoutDirection() != View.LAYOUT_DIRECTION_RTL) {
// This will happen on v17- devices
return;
}
@@ -426,12 +425,12 @@
final Drawable drawableEnd = new TestDrawable(0xFF0000FF, 20, 20);
final Drawable drawableBottom = new TestDrawable(0xFF00FF00, 20, 20);
- onView(withId(R.id.text_view)).perform(setLayoutDirection(ViewCompat.LAYOUT_DIRECTION_RTL));
+ onView(withId(R.id.text_view)).perform(setLayoutDirection(View.LAYOUT_DIRECTION_RTL));
onView(withId(R.id.text_view)).perform(setCompoundDrawablesRelative(drawableStart,
drawableTop, drawableEnd, drawableBottom));
// Check to see whether our text view is under RTL mode
- if (ViewCompat.getLayoutDirection(mTextView) != ViewCompat.LAYOUT_DIRECTION_RTL) {
+ if (mTextView.getLayoutDirection() != View.LAYOUT_DIRECTION_RTL) {
// This will happen on v17- devices
return;
}
diff --git a/core/core/src/main/java/androidx/core/app/ActivityCompat.java b/core/core/src/main/java/androidx/core/app/ActivityCompat.java
index 6ac4335..d89856a 100644
--- a/core/core/src/main/java/androidx/core/app/ActivityCompat.java
+++ b/core/core/src/main/java/androidx/core/app/ActivityCompat.java
@@ -466,7 +466,7 @@
* </p>
* <p>
* Calling this API for permissions already granted to your app would show UI
- * to the user to decided whether the app can still hold these permissions. This
+ * to the user to decide whether the app can still hold these permissions. This
* can be useful if the way your app uses the data guarded by the permissions
* changes significantly.
* </p>
diff --git a/core/core/src/main/java/androidx/core/graphics/drawable/DrawableCompat.java b/core/core/src/main/java/androidx/core/graphics/drawable/DrawableCompat.java
index a4d6ea9..8dfcf26 100644
--- a/core/core/src/main/java/androidx/core/graphics/drawable/DrawableCompat.java
+++ b/core/core/src/main/java/androidx/core/graphics/drawable/DrawableCompat.java
@@ -26,6 +26,7 @@
import android.os.Build;
import android.util.AttributeSet;
import android.util.Log;
+import android.view.View;
import androidx.annotation.ColorInt;
import androidx.annotation.DoNotInline;
@@ -416,9 +417,9 @@
sGetLayoutDirectionMethod = null;
}
}
- return ViewCompat.LAYOUT_DIRECTION_LTR;
+ return View.LAYOUT_DIRECTION_LTR;
} else {
- return ViewCompat.LAYOUT_DIRECTION_LTR;
+ return View.LAYOUT_DIRECTION_LTR;
}
}
diff --git a/core/core/src/main/java/androidx/core/graphics/drawable/RoundedBitmapDrawableFactory.java b/core/core/src/main/java/androidx/core/graphics/drawable/RoundedBitmapDrawableFactory.java
index 7bd0157..c9c3cd3 100644
--- a/core/core/src/main/java/androidx/core/graphics/drawable/RoundedBitmapDrawableFactory.java
+++ b/core/core/src/main/java/androidx/core/graphics/drawable/RoundedBitmapDrawableFactory.java
@@ -22,12 +22,12 @@
import android.graphics.Rect;
import android.os.Build;
import android.util.Log;
+import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.graphics.BitmapCompat;
import androidx.core.view.GravityCompat;
-import androidx.core.view.ViewCompat;
import java.io.InputStream;
@@ -60,7 +60,7 @@
void gravityCompatApply(int gravity, int bitmapWidth, int bitmapHeight,
Rect bounds, Rect outRect) {
GravityCompat.apply(gravity, bitmapWidth, bitmapHeight,
- bounds, outRect, ViewCompat.LAYOUT_DIRECTION_LTR);
+ bounds, outRect, View.LAYOUT_DIRECTION_LTR);
}
}
diff --git a/core/core/src/main/java/androidx/core/text/BidiFormatter.java b/core/core/src/main/java/androidx/core/text/BidiFormatter.java
index 7f9b89e..baf10f1 100644
--- a/core/core/src/main/java/androidx/core/text/BidiFormatter.java
+++ b/core/core/src/main/java/androidx/core/text/BidiFormatter.java
@@ -19,8 +19,7 @@
import static androidx.core.text.TextDirectionHeuristicsCompat.FIRSTSTRONG_LTR;
import android.text.SpannableStringBuilder;
-
-import androidx.core.view.ViewCompat;
+import android.view.View;
import java.util.Locale;
@@ -514,7 +513,7 @@
* @return true if the {@code locale} directionality is RTL. False otherwise.
*/
static boolean isRtlLocale(Locale locale) {
- return (TextUtilsCompat.getLayoutDirectionFromLocale(locale) == ViewCompat.LAYOUT_DIRECTION_RTL);
+ return (TextUtilsCompat.getLayoutDirectionFromLocale(locale) == View.LAYOUT_DIRECTION_RTL);
}
/**
diff --git a/core/core/src/main/java/androidx/core/text/TextDirectionHeuristicsCompat.java b/core/core/src/main/java/androidx/core/text/TextDirectionHeuristicsCompat.java
index 5f6fe93..565f6be 100644
--- a/core/core/src/main/java/androidx/core/text/TextDirectionHeuristicsCompat.java
+++ b/core/core/src/main/java/androidx/core/text/TextDirectionHeuristicsCompat.java
@@ -17,7 +17,7 @@
package androidx.core.text;
-import androidx.core.view.ViewCompat;
+import android.view.View;
import java.nio.CharBuffer;
@@ -247,7 +247,7 @@
@Override
protected boolean defaultIsRtl() {
final int dir = TextUtilsCompat.getLayoutDirectionFromLocale(java.util.Locale.getDefault());
- return (dir == ViewCompat.LAYOUT_DIRECTION_RTL);
+ return (dir == View.LAYOUT_DIRECTION_RTL);
}
static final TextDirectionHeuristicLocale INSTANCE =
diff --git a/core/core/src/main/java/androidx/core/view/MarginLayoutParamsCompat.java b/core/core/src/main/java/androidx/core/view/MarginLayoutParamsCompat.java
index 8039d09..1671bdb 100644
--- a/core/core/src/main/java/androidx/core/view/MarginLayoutParamsCompat.java
+++ b/core/core/src/main/java/androidx/core/view/MarginLayoutParamsCompat.java
@@ -107,11 +107,11 @@
int result;
result = lp.getLayoutDirection();
- if ((result != ViewCompat.LAYOUT_DIRECTION_LTR)
- && (result != ViewCompat.LAYOUT_DIRECTION_RTL)) {
+ if ((result != View.LAYOUT_DIRECTION_LTR)
+ && (result != View.LAYOUT_DIRECTION_RTL)) {
// This can happen on older platform releases where the default (unset) layout direction
// is -1
- result = ViewCompat.LAYOUT_DIRECTION_LTR;
+ result = View.LAYOUT_DIRECTION_LTR;
}
return result;
}
diff --git a/core/core/src/main/java/androidx/core/view/ViewCompat.java b/core/core/src/main/java/androidx/core/view/ViewCompat.java
index 07a7885..0345c75 100644
--- a/core/core/src/main/java/androidx/core/view/ViewCompat.java
+++ b/core/core/src/main/java/androidx/core/view/ViewCompat.java
@@ -356,24 +356,36 @@
/**
* Horizontal layout direction of this view is from Left to Right.
+ *
+ * @deprecated Use {@link View#LAYOUT_DIRECTION_LTR} directly.
*/
+ @Deprecated
public static final int LAYOUT_DIRECTION_LTR = 0;
/**
* Horizontal layout direction of this view is from Right to Left.
+ *
+ * @deprecated Use {@link View#LAYOUT_DIRECTION_RTL} directly.
*/
+ @Deprecated
public static final int LAYOUT_DIRECTION_RTL = 1;
/**
* Horizontal layout direction of this view is inherited from its parent.
* Use with {@link #setLayoutDirection}.
+ *
+ * @deprecated Use {@link View#LAYOUT_DIRECTION_INHERIT} directly.
*/
+ @Deprecated
public static final int LAYOUT_DIRECTION_INHERIT = 2;
/**
* Horizontal layout direction of this view is from deduced from the default language
* script for the locale. Use with {@link #setLayoutDirection}.
+ *
+ * @deprecated Use {@link View#LAYOUT_DIRECTION_LOCALE} directly.
*/
+ @Deprecated
public static final int LAYOUT_DIRECTION_LOCALE = 3;
/**
diff --git a/core/core/src/main/java/androidx/core/view/WindowInsetsCompat.java b/core/core/src/main/java/androidx/core/view/WindowInsetsCompat.java
index 8f1c28b..96c37bc 100644
--- a/core/core/src/main/java/androidx/core/view/WindowInsetsCompat.java
+++ b/core/core/src/main/java/androidx/core/view/WindowInsetsCompat.java
@@ -166,7 +166,7 @@
public static WindowInsetsCompat toWindowInsetsCompat(@NonNull WindowInsets insets,
@Nullable View view) {
WindowInsetsCompat wic = new WindowInsetsCompat(Preconditions.checkNotNull(insets));
- if (view != null && ViewCompat.isAttachedToWindow(view)) {
+ if (view != null && view.isAttachedToWindow()) {
// Pass the root window insets, which is useful if the Activity is adjustResize
wic.setRootWindowInsets(ViewCompat.getRootWindowInsets(view));
// Pass in the root view which allows the WIC to make of a copy of it's visible bounds
diff --git a/core/core/src/main/java/androidx/core/widget/ListViewAutoScrollHelper.java b/core/core/src/main/java/androidx/core/widget/ListViewAutoScrollHelper.java
index 3bbb83a..c4bc6b6 100644
--- a/core/core/src/main/java/androidx/core/widget/ListViewAutoScrollHelper.java
+++ b/core/core/src/main/java/androidx/core/widget/ListViewAutoScrollHelper.java
@@ -37,7 +37,7 @@
@Override
public void scrollTargetBy(int deltaX, int deltaY) {
- ListViewCompat.scrollListBy(mTarget, deltaY);
+ mTarget.scrollListBy(deltaY);
}
@Override
diff --git a/core/core/src/main/java/androidx/core/widget/ListViewCompat.java b/core/core/src/main/java/androidx/core/widget/ListViewCompat.java
index 590224d..894c7cb 100644
--- a/core/core/src/main/java/androidx/core/widget/ListViewCompat.java
+++ b/core/core/src/main/java/androidx/core/widget/ListViewCompat.java
@@ -21,8 +21,11 @@
import androidx.annotation.NonNull;
/**
- * Helper for accessing features in {@link ListView}
+ * Helper for accessing features in {@link ListView}.
+ *
+ * @deprecated Use {@link ListView} directly.
*/
+@Deprecated
public final class ListViewCompat {
/**
@@ -30,7 +33,9 @@
*
* @param listView the list to scroll
* @param y the amount of pixels to scroll by vertically
+ * @deprecated Use {@link ListView#scrollListBy(int)} directly.
*/
+ @Deprecated
public static void scrollListBy(@NonNull ListView listView, int y) {
// Call the framework version directly
listView.scrollListBy(y);
@@ -45,7 +50,9 @@
* @return true if the list can be scrolled in the specified direction,
* false otherwise.
* @see #scrollListBy(ListView, int)
+ * @deprecated Use {@link ListView#canScrollList(int)} directly.
*/
+ @Deprecated
public static boolean canScrollList(@NonNull ListView listView, int direction) {
// Call the framework version directly
return listView.canScrollList(direction);
diff --git a/core/core/src/main/java/androidx/core/widget/NestedScrollView.java b/core/core/src/main/java/androidx/core/widget/NestedScrollView.java
index e6240b5..8eebc91 100644
--- a/core/core/src/main/java/androidx/core/widget/NestedScrollView.java
+++ b/core/core/src/main/java/androidx/core/widget/NestedScrollView.java
@@ -885,7 +885,7 @@
mActivePointerId = INVALID_POINTER;
recycleVelocityTracker();
if (mScroller.springBack(getScrollX(), getScrollY(), 0, 0, 0, getScrollRange())) {
- ViewCompat.postInvalidateOnAnimation(this);
+ postInvalidateOnAnimation();
}
stopNestedScroll(ViewCompat.TYPE_TOUCH);
break;
@@ -993,7 +993,7 @@
}
} else if (mScroller.springBack(getScrollX(), getScrollY(), 0, 0, 0,
getScrollRange())) {
- ViewCompat.postInvalidateOnAnimation(this);
+ postInvalidateOnAnimation();
}
endTouchDrag();
break;
@@ -1003,7 +1003,7 @@
if (mIsBeingDragged && getChildCount() > 0) {
if (mScroller.springBack(getScrollX(), getScrollY(), 0, 0, 0,
getScrollRange())) {
- ViewCompat.postInvalidateOnAnimation(this);
+ postInvalidateOnAnimation();
}
}
endTouchDrag();
@@ -1171,7 +1171,7 @@
}
if (!mEdgeGlowTop.isFinished() || !mEdgeGlowBottom.isFinished()) {
- ViewCompat.postInvalidateOnAnimation(this);
+ postInvalidateOnAnimation();
hitScrollBarrier = false;
}
@@ -1994,7 +1994,7 @@
}
if (!mScroller.isFinished()) {
- ViewCompat.postInvalidateOnAnimation(this);
+ postInvalidateOnAnimation();
} else {
stopNestedScroll(ViewCompat.TYPE_NON_TOUCH);
}
@@ -2041,7 +2041,7 @@
stopNestedScroll(ViewCompat.TYPE_NON_TOUCH);
}
mLastScrollerY = getScrollY();
- ViewCompat.postInvalidateOnAnimation(this);
+ postInvalidateOnAnimation();
}
private void abortAnimatedScroll() {
@@ -2366,7 +2366,7 @@
canvas.translate(xTranslation, yTranslation);
mEdgeGlowTop.setSize(width, height);
if (mEdgeGlowTop.draw(canvas)) {
- ViewCompat.postInvalidateOnAnimation(this);
+ postInvalidateOnAnimation();
}
canvas.restoreToCount(restoreCount);
}
@@ -2390,7 +2390,7 @@
canvas.rotate(180, width, 0);
mEdgeGlowBottom.setSize(width, height);
if (mEdgeGlowBottom.draw(canvas)) {
- ViewCompat.postInvalidateOnAnimation(this);
+ postInvalidateOnAnimation();
}
canvas.restoreToCount(restoreCount);
}
diff --git a/customview/customview/src/main/java/androidx/customview/widget/ExploreByTouchHelper.java b/customview/customview/src/main/java/androidx/customview/widget/ExploreByTouchHelper.java
index 51e136d..c746d38 100644
--- a/customview/customview/src/main/java/androidx/customview/widget/ExploreByTouchHelper.java
+++ b/customview/customview/src/main/java/androidx/customview/widget/ExploreByTouchHelper.java
@@ -145,10 +145,8 @@
// Host view must be focusable so that we can delegate to virtual
// views.
host.setFocusable(true);
- if (ViewCompat.getImportantForAccessibility(host)
- == ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
- ViewCompat.setImportantForAccessibility(
- host, ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES);
+ if (host.getImportantForAccessibility() == View.IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
+ host.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
}
}
@@ -381,7 +379,7 @@
case View.FOCUS_FORWARD:
case View.FOCUS_BACKWARD:
final boolean isLayoutRtl =
- ViewCompat.getLayoutDirection(mHost) == ViewCompat.LAYOUT_DIRECTION_RTL;
+ mHost.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
nextFocusedNode = FocusStrategy.findNextFocusInRelativeDirection(allNodes,
SPARSE_VALUES_ADAPTER, NODE_ADAPTER, focusedNode, direction, isLayoutRtl,
false);
@@ -873,7 +871,7 @@
}
private boolean performActionForHost(int action, Bundle arguments) {
- return ViewCompat.performAccessibilityAction(mHost, action, arguments);
+ return mHost.performAccessibilityAction(action, arguments);
}
private boolean performActionForChild(int virtualViewId, int action, Bundle arguments) {
diff --git a/development/build_log_simplifier/messages.ignore b/development/build_log_simplifier/messages.ignore
index 2589ace..256f54e 100644
--- a/development/build_log_simplifier/messages.ignore
+++ b/development/build_log_simplifier/messages.ignore
@@ -523,50 +523,6 @@
public abstract java\.util\.List<androidx\.room\.integration\.kotlintestapp\.test\.JvmNameInDaoTest\.JvmNameEntity> jvmQuery\(\);
public abstract androidx\.room\.integration\.kotlintestapp\.test\.JvmNameInDaoTest\.JvmNameDao jvmDao\(\);
\^
-ViewCompat\.setBackground\(view, new ColorDrawable\(color\)\);
-\$SUPPORT/transition/transition/src/androidTest/java/androidx/transition/ChangeClipBoundsTest\.java:[0-9]+: warning: \[deprecation\] getClipBounds\(View\) in ViewCompat has been deprecated
-assertNull\(ViewCompat\.getClipBounds\(redSquare\)\);
-\$SUPPORT/transition/transition/src/androidTest/java/androidx/transition/ChangeClipBoundsTest\.java:[0-9]+: warning: \[deprecation\] setClipBounds\(View,Rect\) in ViewCompat has been deprecated
-ViewCompat\.setClipBounds\(redSquare, newClip\);
-final Rect endRect = ViewCompat\.getClipBounds\(redSquare\);
-ViewCompat\.setClipBounds\(redSquare, null\);
-ViewCompat\.setHasTransientState\(view, true\);
-ViewCompat\.setHasTransientState\(view, false\);
-\$SUPPORT/transition/transition/src/main/java/androidx/transition/ChangeBounds\.java:[0-9]+: warning: \[deprecation\] isLaidOut\(View\) in ViewCompat has been deprecated
-if \(ViewCompat\.isLaidOut\(view\) \|\| view\.getWidth\(\) != [0-9]+ \|\| view\.getHeight\(\) != [0-9]+\) \{
-\$SUPPORT/transition/transition/src/main/java/androidx/transition/ChangeBounds\.java:[0-9]+: warning: \[deprecation\] getClipBounds\(View\) in ViewCompat has been deprecated
-values\.values\.put\(PROPNAME_CLIP, ViewCompat\.getClipBounds\(view\)\);
-\$SUPPORT/transition/transition/src/main/java/androidx/transition/ChangeBounds\.java:[0-9]+: warning: \[deprecation\] setClipBounds\(View,Rect\) in ViewCompat has been deprecated
-ViewCompat\.setClipBounds\(view, startClip\);
-ViewCompat\.setClipBounds\(mView, clip\);
-Rect pauseClip = ViewCompat\.getClipBounds\(mView\);
-ViewCompat\.setClipBounds\(mView, pauseClip\);
-\$SUPPORT/transition/transition/src/main/java/androidx/transition/ChangeClipBounds\.java:[0-9]+: warning: \[deprecation\] getClipBounds\(View\) in ViewCompat has been deprecated
-clip = ViewCompat\.getClipBounds\(view\);
-\$SUPPORT/transition/transition/src/main/java/androidx/transition/ChangeClipBounds\.java:[0-9]+: warning: \[deprecation\] setClipBounds\(View,Rect\) in ViewCompat has been deprecated
-ViewCompat\.setClipBounds\(endValues\.view, start\);
-Rect clipBounds = ViewCompat\.getClipBounds\(mView\);
-ViewCompat\.setClipBounds\(mView, mEnd\);
-ViewCompat\.setClipBounds\(mView, clipBounds\);
-ViewCompat\.setClipBounds\(mView, mStart\);
-\$SUPPORT/transition/transition/src/main/java/androidx/transition/GhostViewPort\.java:[0-9]+: warning: \[deprecation\] postInvalidateOnAnimation\(View\) in ViewCompat has been deprecated
-ViewCompat\.postInvalidateOnAnimation\(GhostViewPort\.this\);
-ViewCompat\.postInvalidateOnAnimation\(mStartParent\);
-\$SUPPORT/transition/transition/src/main/java/androidx/transition/SidePropagation\.java:[0-9]+: warning: \[deprecation\] getLayoutDirection\(View\) in ViewCompat has been deprecated
-final boolean isRtl = ViewCompat\.getLayoutDirection\(sceneRoot\)
-\$SUPPORT/transition/transition/src/main/java/androidx/transition/Slide\.java:[0-9]+: warning: \[deprecation\] getLayoutDirection\(View\) in ViewCompat has been deprecated
-\$SUPPORT/transition/transition/src/main/java/androidx/transition/TransitionManager\.java:[0-9]+: warning: \[deprecation\] isLaidOut\(View\) in ViewCompat has been deprecated
-if \(!ViewCompat\.isLaidOut\(sceneRoot\)
-if \(!sPendingTransitions\.contains\(sceneRoot\) \&\& ViewCompat\.isLaidOut\(sceneRoot\)\) \{
-if \(sPendingTransitions\.contains\(sceneRoot\) \|\| !ViewCompat\.isLaidOut\(sceneRoot\)
-\$SUPPORT/transition/transition/src/main/java/androidx/transition/ViewOverlayApi[0-9]+\.java:[0-9]+: warning: \[deprecation\] isAttachedToWindow\(View\) in ViewCompat has been deprecated
-\&\& ViewCompat\.isAttachedToWindow\(parent\)\) \{
-\$SUPPORT/transition/transition/src/main/java/androidx/transition/ViewUtils\.java:[0-9]+: warning: \[deprecation\] getClipBounds\(View\) in ViewCompat has been deprecated
-return ViewCompat\.getClipBounds\(view\);
-\$SUPPORT/transition/transition/src/main/java/androidx/transition/ViewUtils\.java:[0-9]+: warning: \[deprecation\] setClipBounds\(View,Rect\) in ViewCompat has been deprecated
-ViewCompat\.setClipBounds\(view, clipBounds\);
-\$SUPPORT/transition/transition/src/main/java/androidx/transition/Fade\.java:[0-9]+: warning: \[deprecation\] hasOverlappingRendering\(View\) in ViewCompat has been deprecated
-if \(ViewCompat\.hasOverlappingRendering\(mView\)
\$SUPPORT/slice/slice\-benchmark/src/androidTest/java/androidx/slice/SliceViewMetrics\.java:[0-9]+: warning: \[deprecation\] SliceView in androidx\.slice\.widget has been deprecated
import androidx\.slice\.widget\.SliceView;
# b/296419682
@@ -638,37 +594,3 @@
docs-public:docs completing
docs-tip-of-tree:docs starting
docs-tip-of-tree:docs completing
-# > Task :transition:transition:compileReleaseJavaWithJavac
-\$SUPPORT/transition/transition/src/main/java/androidx/transition/Transition\.java:[0-9]+: warning: \[deprecation\] setHasTransientState\(View,boolean\) in ViewCompat has been deprecated
-ViewCompat\.setHasTransientState\(alreadyMatched, false\);
-# > Task :transition:transition:compileDebugAndroidTestJavaWithJavac
-\$SUPPORT/transition/transition/src/androidTest/java/androidx/transition/GhostViewTest\.java:[0-9]+: warning: \[deprecation\] setBackground\(View,Drawable\) in ViewCompat has been deprecated
-ViewCompat\.setBackground\(rule\.getActivity\(\)\.getRoot\(\), new ColorDrawable\(Color\.WHITE\)\);
-# > Task :viewpager2:integration-tests:testapp:compileDebugAndroidTestKotlin
-w: file://\$SUPPORT/viewpager[0-9]+/integration\-tests/testapp/src/androidTest/java/androidx/viewpager[0-9]+/integration/testapp/test/util/ViewPagerActions\.kt:[0-9]+:[0-9]+ 'getLayoutDirection\(View\): Int' is deprecated\. Deprecated in Java
-# > Task :fragment:fragment:compileReleaseKotlin
-w: file://\$SUPPORT/fragment/fragment/src/main/java/androidx/fragment/app/DefaultSpecialEffectsController\.kt:[0-9]+:[0-9]+ 'isLaidOut\(View\): Boolean' is deprecated\. Deprecated in Java
-w: file://\$SUPPORT/fragment/fragment/src/main/java/androidx/fragment/app/SpecialEffectsController\.kt:[0-9]+:[0-9]+ 'isAttachedToWindow\(View\): Boolean' is deprecated\. Deprecated in Java
-# > Task :slidingpanelayout:slidingpanelayout:compileReleaseKotlin
-w: file://\$SUPPORT/slidingpanelayout/slidingpanelayout/src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout\.kt:[0-9]+:[0-9]+ 'setImportantForAccessibility\(View, Int\): Unit' is deprecated\. Deprecated in Java
-w: file://\$SUPPORT/slidingpanelayout/slidingpanelayout/src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout\.kt:[0-9]+:[0-9]+ 'IMPORTANT_FOR_ACCESSIBILITY_YES: Int' is deprecated\. Deprecated in Java
-w: file://\$SUPPORT/slidingpanelayout/slidingpanelayout/src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout\.kt:[0-9]+:[0-9]+ 'getParentForAccessibility\(View\): ViewParent\?' is deprecated\. Deprecated in Java
-# > Task :compose:ui:ui:compileReleaseKotlinAndroid
-w: file://\$SUPPORT/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView\.android\.kt:[0-9]+:[0-9]+ 'setImportantForAccessibility\(View, Int\): Unit' is deprecated\. Deprecated in Java
-w: file://\$SUPPORT/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView\.android\.kt:[0-9]+:[0-9]+ 'IMPORTANT_FOR_ACCESSIBILITY_YES: Int' is deprecated\. Deprecated in Java
-w: file://\$SUPPORT/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView\.android\.kt:[0-9]+:[0-9]+ 'IMPORTANT_FOR_ACCESSIBILITY_AUTO: Int' is deprecated\. Deprecated in Java
-w: file://\$SUPPORT/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat\.android\.kt:[0-9]+:[0-9]+ 'getParentForAccessibility\(View\): ViewParent\?' is deprecated\. Deprecated in Java
-# > Task :fragment:fragment:compileDebugAndroidTestKotlin
-w: file://\$SUPPORT/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentAnimationTest\.kt:[0-9]+:[0-9]+ 'isAttachedToWindow\(View\): Boolean' is deprecated\. Deprecated in Java
-w: file://\$SUPPORT/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentAnimatorTest\.kt:[0-9]+:[0-9]+ 'isAttachedToWindow\(View\): Boolean' is deprecated\. Deprecated in Java
-w: file://\$SUPPORT/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentLifecycleTest\.kt:[0-9]+:[0-9]+ 'isAttachedToWindow\(View\): Boolean' is deprecated\. Deprecated in Java
-# > Task :preference:preference:compileDebugAndroidTestKotlin
-w: file://\$SUPPORT/preference/preference/src/androidTest/java/androidx/preference/tests/SelectableTest\.kt:[0-9]+:[0-9]+ 'setBackground\(View, Drawable\?\): Unit' is deprecated\. Deprecated in Java
-# > Task :viewpager2:viewpager2:compileDebugAndroidTestKotlin
-w: file://\$SUPPORT/viewpager[0-9]+/viewpager[0-9]+/src/androidTest/java/androidx/viewpager[0-9]+/widget/AccessibilityTest\.kt:[0-9]+:[0-9]+ 'performAccessibilityAction\(View, Int, Bundle\?\): Boolean' is deprecated\. Deprecated in Java
-w: file://\$SUPPORT/viewpager[0-9]+/viewpager[0-9]+/src/androidTest/java/androidx/viewpager[0-9]+/widget/AccessibilityTest\.kt:[0-9]+:[0-9]+ 'onInitializeAccessibilityNodeInfo\(View, AccessibilityNodeInfoCompat\): Unit' is deprecated\. Deprecated in Java
-w: file://\$SUPPORT/viewpager[0-9]+/viewpager[0-9]+/src/androidTest/java/androidx/viewpager[0-9]+/widget/BaseTest\.kt:[0-9]+:[0-9]+ 'getLayoutDirection\(View\): Int' is deprecated\. Deprecated in Java
-w: file://\$SUPPORT/viewpager[0-9]+/viewpager[0-9]+/src/androidTest/java/androidx/viewpager[0-9]+/widget/FakeDragTest\.kt:[0-9]+:[0-9]+ 'performAccessibilityAction\(View, Int, Bundle\?\): Boolean' is deprecated\. Deprecated in Java
-w: file://\$SUPPORT/viewpager[0-9]+/viewpager[0-9]+/src/androidTest/java/androidx/viewpager[0-9]+/widget/HostFragmentBackStackTest\.kt:[0-9]+:[0-9]+ 'generateViewId\(\): Int' is deprecated\. Deprecated in Java
-# > Task :compose:ui:ui:compileDebugAndroidTestKotlinAndroid
-w: file://\$SUPPORT/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/AndroidAccessibilityTest\.kt:[0-9]+:[0-9]+ 'IMPORTANT_FOR_ACCESSIBILITY_YES: Int' is deprecated\. Deprecated in Java
diff --git a/drawerlayout/drawerlayout/src/main/java/androidx/drawerlayout/widget/DrawerLayout.java b/drawerlayout/drawerlayout/src/main/java/androidx/drawerlayout/widget/DrawerLayout.java
index 0ffddb8..1ee2af5 100644
--- a/drawerlayout/drawerlayout/src/main/java/androidx/drawerlayout/widget/DrawerLayout.java
+++ b/drawerlayout/drawerlayout/src/main/java/androidx/drawerlayout/widget/DrawerLayout.java
@@ -360,8 +360,7 @@
// So that we can catch the back button
setFocusableInTouchMode(true);
- ViewCompat.setImportantForAccessibility(this,
- ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES);
+ setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
ViewCompat.setAccessibilityDelegate(this, new AccessibilityDelegate());
setMotionEventSplittingEnabled(false);
@@ -604,7 +603,7 @@
*/
public void setDrawerLockMode(@LockMode int lockMode, @EdgeGravity int edgeGravity) {
final int absGravity = GravityCompat.getAbsoluteGravity(edgeGravity,
- ViewCompat.getLayoutDirection(this));
+ getLayoutDirection());
switch (edgeGravity) {
case Gravity.LEFT:
@@ -679,14 +678,14 @@
*/
@LockMode
public int getDrawerLockMode(@EdgeGravity int edgeGravity) {
- int layoutDirection = ViewCompat.getLayoutDirection(this);
+ int layoutDirection = getLayoutDirection();
switch (edgeGravity) {
case Gravity.LEFT:
if (mLockModeLeft != LOCK_MODE_UNDEFINED) {
return mLockModeLeft;
}
- int leftLockMode = (layoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR)
+ int leftLockMode = (layoutDirection == View.LAYOUT_DIRECTION_LTR)
? mLockModeStart : mLockModeEnd;
if (leftLockMode != LOCK_MODE_UNDEFINED) {
return leftLockMode;
@@ -696,7 +695,7 @@
if (mLockModeRight != LOCK_MODE_UNDEFINED) {
return mLockModeRight;
}
- int rightLockMode = (layoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR)
+ int rightLockMode = (layoutDirection == View.LAYOUT_DIRECTION_LTR)
? mLockModeEnd : mLockModeStart;
if (rightLockMode != LOCK_MODE_UNDEFINED) {
return rightLockMode;
@@ -706,7 +705,7 @@
if (mLockModeStart != LOCK_MODE_UNDEFINED) {
return mLockModeStart;
}
- int startLockMode = (layoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR)
+ int startLockMode = (layoutDirection == View.LAYOUT_DIRECTION_LTR)
? mLockModeLeft : mLockModeRight;
if (startLockMode != LOCK_MODE_UNDEFINED) {
return startLockMode;
@@ -716,7 +715,7 @@
if (mLockModeEnd != LOCK_MODE_UNDEFINED) {
return mLockModeEnd;
}
- int endLockMode = (layoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR)
+ int endLockMode = (layoutDirection == View.LAYOUT_DIRECTION_LTR)
? mLockModeRight : mLockModeLeft;
if (endLockMode != LOCK_MODE_UNDEFINED) {
return endLockMode;
@@ -755,7 +754,7 @@
*/
public void setDrawerTitle(@EdgeGravity int edgeGravity, @Nullable CharSequence title) {
final int absGravity = GravityCompat.getAbsoluteGravity(
- edgeGravity, ViewCompat.getLayoutDirection(this));
+ edgeGravity, getLayoutDirection());
if (absGravity == Gravity.LEFT) {
mTitleLeft = title;
} else if (absGravity == Gravity.RIGHT) {
@@ -774,7 +773,7 @@
@Nullable
public CharSequence getDrawerTitle(@EdgeGravity int edgeGravity) {
final int absGravity = GravityCompat.getAbsoluteGravity(
- edgeGravity, ViewCompat.getLayoutDirection(this));
+ edgeGravity, getLayoutDirection());
if (absGravity == Gravity.LEFT) {
return mTitleLeft;
} else if (absGravity == Gravity.RIGHT) {
@@ -937,11 +936,10 @@
if ((!isDrawerOpen && !isDrawerView(child)) || (isDrawerOpen && child == drawerView)) {
// Drawer is closed and this is a content view or this is an
// open drawer view, so it should be visible.
- ViewCompat.setImportantForAccessibility(child,
- ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES);
+ child.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
} else {
- ViewCompat.setImportantForAccessibility(child,
- ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
+ child.setImportantForAccessibility(
+ View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
}
}
}
@@ -984,7 +982,7 @@
*/
int getDrawerViewAbsoluteGravity(View drawerView) {
final int gravity = ((LayoutParams) drawerView.getLayoutParams()).gravity;
- return GravityCompat.getAbsoluteGravity(gravity, ViewCompat.getLayoutDirection(this));
+ return GravityCompat.getAbsoluteGravity(gravity, getLayoutDirection());
}
boolean checkDrawerViewAbsoluteGravity(View drawerView, int checkFor) {
@@ -1024,7 +1022,7 @@
*/
View findDrawerWithGravity(int gravity) {
final int absHorizGravity = GravityCompat.getAbsoluteGravity(
- gravity, ViewCompat.getLayoutDirection(this)) & Gravity.HORIZONTAL_GRAVITY_MASK;
+ gravity, getLayoutDirection()) & Gravity.HORIZONTAL_GRAVITY_MASK;
final int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = getChildAt(i);
@@ -1099,7 +1097,7 @@
setMeasuredDimension(widthSize, heightSize);
final boolean applyInsets = mLastInsets != null && ViewCompat.getFitsSystemWindows(this);
- final int layoutDirection = ViewCompat.getLayoutDirection(this);
+ final int layoutDirection = getLayoutDirection();
// Only one drawer is permitted along each vertical edge (left / right). These two booleans
// are tracking the presence of the edge drawers.
@@ -1204,9 +1202,9 @@
}
private Drawable resolveLeftShadow() {
- int layoutDirection = ViewCompat.getLayoutDirection(this);
+ int layoutDirection = getLayoutDirection();
// Prefer shadows defined with start/end gravity over left and right.
- if (layoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR) {
+ if (layoutDirection == View.LAYOUT_DIRECTION_LTR) {
if (mShadowStart != null) {
// Correct drawable layout direction, if needed.
mirror(mShadowStart, layoutDirection);
@@ -1223,8 +1221,8 @@
}
private Drawable resolveRightShadow() {
- int layoutDirection = ViewCompat.getLayoutDirection(this);
- if (layoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR) {
+ int layoutDirection = getLayoutDirection();
+ if (layoutDirection == View.LAYOUT_DIRECTION_LTR) {
if (mShadowEnd != null) {
// Correct drawable layout direction, if needed.
mirror(mShadowEnd, layoutDirection);
@@ -1370,7 +1368,7 @@
boolean leftDraggerSettling = mLeftDragger.continueSettling(true);
boolean rightDraggerSettling = mRightDragger.continueSettling(true);
if (leftDraggerSettling || rightDraggerSettling) {
- ViewCompat.postInvalidateOnAnimation(this);
+ postInvalidateOnAnimation();
}
}
@@ -1519,7 +1517,7 @@
boolean isDrawerView(View child) {
final int gravity = ((LayoutParams) child.getLayoutParams()).gravity;
final int absGravity = GravityCompat.getAbsoluteGravity(gravity,
- ViewCompat.getLayoutDirection(child));
+ child.getLayoutDirection());
if ((absGravity & Gravity.LEFT) != 0) {
// This child is a left-edge drawer
return true;
@@ -2056,7 +2054,7 @@
boolean shouldBeRegistered = visibleDrawer != null
&& currentDispatcher != null
&& getDrawerLockMode(visibleDrawer) == LOCK_MODE_UNLOCKED
- && ViewCompat.isAttachedToWindow(this);
+ && this.isAttachedToWindow();
if (shouldBeRegistered && mBackInvokedDispatcher == null) {
if (mBackInvokedCallback == null) {
@@ -2168,13 +2166,12 @@
if (openDrawer != null || isDrawerView(child)) {
// A drawer is already open or the new view is a drawer, so the
// new view should start out hidden.
- ViewCompat.setImportantForAccessibility(child,
- ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
+ child.setImportantForAccessibility(
+ View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
} else {
// Otherwise this is a content view and no drawer is open, so the
// new view should start out visible.
- ViewCompat.setImportantForAccessibility(child,
- ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES);
+ child.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
}
}
@@ -2185,10 +2182,10 @@
// IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDATS is not
// supported on older platforms but we want to hide the entire
// content and not opened drawers if a drawer is opened.
- return ViewCompat.getImportantForAccessibility(child)
- != ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS
- && ViewCompat.getImportantForAccessibility(child)
- != ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO;
+ return child.getImportantForAccessibility()
+ != View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS
+ && child.getImportantForAccessibility()
+ != View.IMPORTANT_FOR_ACCESSIBILITY_NO;
}
/**
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentAnimationTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentAnimationTest.kt
index e139fc6..e50a9d2 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentAnimationTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentAnimationTest.kt
@@ -31,7 +31,6 @@
import androidx.activity.BackEventCompat
import androidx.annotation.AnimRes
import androidx.annotation.LayoutRes
-import androidx.core.view.ViewCompat
import androidx.fragment.app.test.FragmentTestActivity
import androidx.fragment.test.R
import androidx.lifecycle.Lifecycle
@@ -404,7 +403,7 @@
assertThat(fragment1.view).isNotNull()
assertThat(fragment1.requireView().visibility).isEqualTo(View.VISIBLE)
assertThat(fragment1.requireView().alpha).isWithin(0f).of(1f)
- assertThat(ViewCompat.isAttachedToWindow(fragment1.requireView())).isTrue()
+ assertThat(fragment1.requireView().isAttachedToWindow()).isTrue()
fragment2.startPostponedEnterTransition()
activityRule.waitForExecution()
@@ -446,7 +445,7 @@
assertThat(fragment1.view).isNotNull()
assertThat(fragment1.requireView().visibility).isEqualTo(View.VISIBLE)
assertThat(fragment1.requireView().alpha).isWithin(0f).of(1f)
- assertThat(ViewCompat.isAttachedToWindow(fragment1.requireView())).isTrue()
+ assertThat(fragment1.requireView().isAttachedToWindow()).isTrue()
assertThat(fragment1.isAdded).isTrue()
assertThat(fragment2.view).isNull()
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentAnimatorTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentAnimatorTest.kt
index a098d19..e7df44c 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentAnimatorTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentAnimatorTest.kt
@@ -28,7 +28,6 @@
import androidx.activity.BackEventCompat
import androidx.annotation.AnimatorRes
import androidx.annotation.LayoutRes
-import androidx.core.view.ViewCompat
import androidx.fragment.app.test.FragmentTestActivity
import androidx.fragment.test.R
import androidx.lifecycle.Lifecycle
@@ -460,7 +459,7 @@
assertThat(fragment1.requireView()).isNotNull()
assertThat(fragment1.requireView().visibility).isEqualTo(View.VISIBLE)
assertThat(fragment1.requireView().alpha).isWithin(0f).of(1f)
- assertThat(ViewCompat.isAttachedToWindow(fragment1.requireView())).isTrue()
+ assertThat(fragment1.requireView().isAttachedToWindow()).isTrue()
fragment2.startPostponedEnterTransition()
activityRule.waitForExecution()
@@ -500,7 +499,7 @@
assertThat(fragment1.view).isNotNull()
assertThat(fragment1.requireView().alpha).isWithin(0f).of(1f)
- assertThat(ViewCompat.isAttachedToWindow(fragment1.requireView())).isTrue()
+ assertThat(fragment1.requireView().isAttachedToWindow()).isTrue()
assertThat(fragment1.isAdded).isTrue()
assertThat(fragment2.view).isNull()
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentLifecycleTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentLifecycleTest.kt
index aedeb6a..6c80ee7 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentLifecycleTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentLifecycleTest.kt
@@ -24,7 +24,6 @@
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
-import androidx.core.view.ViewCompat
import androidx.fragment.app.FragmentManager.FragmentLifecycleCallbacks
import androidx.fragment.app.test.EmptyFragmentTestActivity
import androidx.fragment.app.test.FragmentTestActivity
@@ -201,7 +200,7 @@
val view = f1.requireView()
assertWithMessage("fragment 1 returned null from getView").that(view).isNotNull()
assertWithMessage("fragment 1's view is not attached to a window")
- .that(ViewCompat.isAttachedToWindow(view)).isTrue()
+ .that(view.isAttachedToWindow()).isTrue()
fm.beginTransaction().remove(f1).commit()
executePendingTransactions(fm)
@@ -210,7 +209,7 @@
assertWithMessage("fragment 1 returned non-null from getView after removal")
.that(f1.view).isNull()
assertWithMessage("fragment 1's previous view is still attached to a window")
- .that(ViewCompat.isAttachedToWindow(view)).isFalse()
+ .that(view.isAttachedToWindow()).isFalse()
}
@Test
@@ -229,7 +228,7 @@
val origView1 = f1.requireView()
assertWithMessage("fragment 1 returned null view").that(origView1).isNotNull()
assertWithMessage("fragment 1's view not attached")
- .that(ViewCompat.isAttachedToWindow(origView1)).isTrue()
+ .that(origView1.isAttachedToWindow()).isTrue()
fm.beginTransaction().replace(android.R.id.content, f2).addToBackStack("stack1").commit()
executePendingTransactions(fm)
@@ -238,11 +237,11 @@
assertWithMessage("fragment 2 is added").that(f2.isAdded).isTrue()
assertWithMessage("fragment 1 returned non-null view").that(f1.view).isNull()
assertWithMessage("fragment 1's old view still attached")
- .that(ViewCompat.isAttachedToWindow(origView1)).isFalse()
+ .that(origView1.isAttachedToWindow()).isFalse()
val origView2 = f2.requireView()
assertWithMessage("fragment 2 returned null view").that(origView2).isNotNull()
assertWithMessage("fragment 2's view not attached")
- .that(ViewCompat.isAttachedToWindow(origView2)).isTrue()
+ .that(origView2.isAttachedToWindow()).isTrue()
fm.popBackStack()
executePendingTransactions(fm)
@@ -251,12 +250,12 @@
assertWithMessage("fragment 2 is added").that(f2.isAdded).isFalse()
assertWithMessage("fragment 2 returned non-null view").that(f2.view).isNull()
assertWithMessage("fragment 2's view still attached")
- .that(ViewCompat.isAttachedToWindow(origView2)).isFalse()
+ .that(origView2.isAttachedToWindow()).isFalse()
val newView1 = f1.requireView()
assertWithMessage("fragment 1 had same view from last attachment")
.that(newView1).isNotSameInstanceAs(origView1)
assertWithMessage("fragment 1's view not attached")
- .that(ViewCompat.isAttachedToWindow(newView1)).isTrue()
+ .that(newView1.isAttachedToWindow()).isTrue()
}
@Test
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/DefaultSpecialEffectsController.kt b/fragment/fragment/src/main/java/androidx/fragment/app/DefaultSpecialEffectsController.kt
index 7aab715..77c93de 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/DefaultSpecialEffectsController.kt
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/DefaultSpecialEffectsController.kt
@@ -726,7 +726,7 @@
override fun onStart(container: ViewGroup) {
// If the container has never been laid out, transitions will not start so
// so lets instantly complete them.
- if (!ViewCompat.isLaidOut(container)) {
+ if (!container.isLaidOut()) {
transitionInfos.forEach { transitionInfo: TransitionInfo ->
val operation: Operation = transitionInfo.operation
if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
@@ -801,7 +801,7 @@
override fun onCommit(container: ViewGroup) {
// If the container has never been laid out, transitions will not start so
// so lets instantly complete them.
- if (!ViewCompat.isLaidOut(container)) {
+ if (!container.isLaidOut()) {
transitionInfos.forEach { transitionInfo: TransitionInfo ->
val operation: Operation = transitionInfo.operation
if (FragmentManager.isLoggingEnabled(Log.VERBOSE)) {
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java b/fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java
index fa5874e..7e09f69 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java
@@ -1627,7 +1627,7 @@
* </p>
* <p>
* Calling this API for permissions already granted to your app would show UI
- * to the user to decided whether the app can still hold these permissions. This
+ * to the user to decide whether the app can still hold these permissions. This
* can be useful if the way your app uses the data guarded by the permissions
* changes significantly.
* </p>
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStateManager.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStateManager.java
index b029457..32d40bc 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStateManager.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStateManager.java
@@ -580,7 +580,7 @@
mFragment.mView.setVisibility(View.GONE);
}
// How I wish we could use doOnAttach
- if (ViewCompat.isAttachedToWindow(mFragment.mView)) {
+ if (mFragment.mView.isAttachedToWindow()) {
ViewCompat.requestApplyInsets(mFragment.mView);
} else {
final View fragmentView = mFragment.mView;
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransitionImpl.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransitionImpl.java
index ac5a7e9..ce3439d 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransitionImpl.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransitionImpl.java
@@ -78,7 +78,7 @@
* containing the bounds relative to the screen that the view is in.
*/
protected void getBoundsOnScreen(View view, Rect epicenter) {
- if (!ViewCompat.isAttachedToWindow(view)) {
+ if (!view.isAttachedToWindow()) {
return;
}
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/SpecialEffectsController.kt b/fragment/fragment/src/main/java/androidx/fragment/app/SpecialEffectsController.kt
index 5e0601cf..e8a96ca 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/SpecialEffectsController.kt
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/SpecialEffectsController.kt
@@ -20,7 +20,6 @@
import android.view.ViewGroup
import androidx.activity.BackEventCompat
import androidx.annotation.CallSuper
-import androidx.core.view.ViewCompat
import androidx.fragment.R
import androidx.fragment.app.SpecialEffectsController.Operation.State.Companion.asOperationState
@@ -203,7 +202,7 @@
}
// If the container is not attached to the window, ignore the special effect
// since none of the special effect systems will run them anyway.
- if (!ViewCompat.isAttachedToWindow(container)) {
+ if (!container.isAttachedToWindow()) {
forceCompleteAllOperations()
operationDirectionIsPop = false
return
@@ -314,7 +313,7 @@
"SpecialEffectsController: Forcing all operations to complete"
)
}
- val attachedToWindow = ViewCompat.isAttachedToWindow(container)
+ val attachedToWindow = container.isAttachedToWindow()
synchronized(pendingOperations) {
updateFinalState()
processStart(pendingOperations)
diff --git a/gridlayout/gridlayout/src/main/java/androidx/gridlayout/widget/GridLayout.java b/gridlayout/gridlayout/src/main/java/androidx/gridlayout/widget/GridLayout.java
index 3936f41..671a7c8 100644
--- a/gridlayout/gridlayout/src/main/java/androidx/gridlayout/widget/GridLayout.java
+++ b/gridlayout/gridlayout/src/main/java/androidx/gridlayout/widget/GridLayout.java
@@ -659,7 +659,7 @@
}
private boolean isLayoutRtlCompat() {
- return ViewCompat.getLayoutDirection(this) == ViewCompat.LAYOUT_DIRECTION_RTL;
+ return getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
}
private int getMargin(View view, boolean horizontal, boolean leading) {
@@ -2746,15 +2746,13 @@
return new Alignment() {
@Override
int getGravityOffset(View view, int cellDelta) {
- boolean isLayoutRtl = ViewCompat.getLayoutDirection(view) ==
- ViewCompat.LAYOUT_DIRECTION_RTL;
+ boolean isLayoutRtl = view.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
return (!isLayoutRtl ? ltr : rtl).getGravityOffset(view, cellDelta);
}
@Override
public int getAlignmentValue(View view, int viewSize, int mode) {
- boolean isLayoutRtl = ViewCompat.getLayoutDirection(view) ==
- ViewCompat.LAYOUT_DIRECTION_RTL;
+ boolean isLayoutRtl = view.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
return (!isLayoutRtl ? ltr : rtl).getAlignmentValue(view, viewSize, mode);
}
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/ServiceBackedPassiveMonitoringClient.kt b/health/health-services-client/src/main/java/androidx/health/services/client/impl/ServiceBackedPassiveMonitoringClient.kt
index c70f09f..606b00e 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/ServiceBackedPassiveMonitoringClient.kt
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/ServiceBackedPassiveMonitoringClient.kt
@@ -66,23 +66,24 @@
service: Class<out PassiveListenerService>,
config: PassiveListenerConfig
): ListenableFuture<Void> {
+ if (!config.isValidPassiveGoal()) {
+ return Futures.immediateFailedFuture(
+ HealthServicesException(
+ "Service registration failed: DataType for the requested " +
+ "passive goal must be tracked"
+ )
+ )
+ }
return executeWithVersionCheck(
{ remoteService, resultFuture ->
- if (config.isValidPassiveGoal()) {
- remoteService.registerPassiveListenerService(
- PassiveListenerServiceRegistrationRequest(
- packageName,
- service.name,
- config
- ),
- StatusCallback(resultFuture)
- )
- } else {
- resultFuture.setException(HealthServicesException(
- "Service registration failed: DataType for the requested " +
- "passive goal must be tracked"
- ))
- }
+ remoteService.registerPassiveListenerService(
+ PassiveListenerServiceRegistrationRequest(
+ packageName,
+ service.name,
+ config
+ ),
+ StatusCallback(resultFuture)
+ )
},
/* minApiVersion= */ 4
)
@@ -104,24 +105,24 @@
executor: Executor,
callback: PassiveListenerCallback
) {
+ if (!config.isValidPassiveGoal()) {
+ callback.onRegistrationFailed(
+ HealthServicesException(
+ "Callback registration failed: DataType for the " +
+ "requested passive goal must be tracked"
+ )
+ )
+ return
+ }
val callbackStub =
PassiveListenerCallbackCache.INSTANCE.getOrCreate(packageName, executor, callback)
val future =
registerListener(callbackStub.listenerKey) { service, result: SettableFuture<Void?> ->
- if (config.isValidPassiveGoal()) {
- service.registerPassiveListenerCallback(
- PassiveListenerCallbackRegistrationRequest(packageName, config),
- callbackStub,
- StatusCallback(result)
- )
- } else {
- result.setException(
- HealthServicesException(
- "Callback registration failed: DataType for the requested " +
- "passive goal must be tracked"
- )
- )
- }
+ service.registerPassiveListenerCallback(
+ PassiveListenerCallbackRegistrationRequest(packageName, config),
+ callbackStub,
+ StatusCallback(result)
+ )
}
Futures.addCallback(
future,
diff --git a/kruth/kruth/src/jvmMain/kotlin/androidx/kruth/PlatformStringSubject.kt b/kruth/kruth/src/jvmMain/kotlin/androidx/kruth/PlatformStringSubject.jvm.kt
similarity index 100%
rename from kruth/kruth/src/jvmMain/kotlin/androidx/kruth/PlatformStringSubject.kt
rename to kruth/kruth/src/jvmMain/kotlin/androidx/kruth/PlatformStringSubject.jvm.kt
diff --git a/leanback/leanback-grid/src/main/java/androidx/leanback/widget/GridLayoutManager.java b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/GridLayoutManager.java
index 8d1f863..2feb9f3 100644
--- a/leanback/leanback-grid/src/main/java/androidx/leanback/widget/GridLayoutManager.java
+++ b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/GridLayoutManager.java
@@ -2844,7 +2844,7 @@
}
int soundEffect;
if (mOrientation == HORIZONTAL) {
- boolean rtl = getLayoutDirection() == ViewCompat.LAYOUT_DIRECTION_RTL;
+ boolean rtl = getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
if (rtl) {
soundEffect = forward ? AudioManager.FX_FOCUS_NAVIGATION_LEFT :
AudioManager.FX_FOCUS_NAVIGATION_RIGHT;
@@ -3273,7 +3273,7 @@
result = ff.findNextFocus(mBaseGridView, focused, absDir);
}
if (canScrollHorizontally()) {
- boolean rtl = getLayoutDirection() == ViewCompat.LAYOUT_DIRECTION_RTL;
+ boolean rtl = getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
final int absDir = (direction == View.FOCUS_FORWARD) ^ rtl
? View.FOCUS_RIGHT : View.FOCUS_LEFT;
result = ff.findNextFocus(mBaseGridView, focused, absDir);
diff --git a/leanback/leanback/src/main/java/androidx/leanback/app/BrowseFragment.java b/leanback/leanback/src/main/java/androidx/leanback/app/BrowseFragment.java
index 66303bc..6901095 100644
--- a/leanback/leanback/src/main/java/androidx/leanback/app/BrowseFragment.java
+++ b/leanback/leanback/src/main/java/androidx/leanback/app/BrowseFragment.java
@@ -1122,8 +1122,8 @@
? mHeadersFragment.getVerticalGridView() : mMainFragment.getView();
}
- boolean isRtl = ViewCompat.getLayoutDirection(focused)
- == ViewCompat.LAYOUT_DIRECTION_RTL;
+ boolean isRtl = focused.getLayoutDirection()
+ == View.LAYOUT_DIRECTION_RTL;
int towardStart = isRtl ? View.FOCUS_RIGHT : View.FOCUS_LEFT;
int towardEnd = isRtl ? View.FOCUS_LEFT : View.FOCUS_RIGHT;
if (mCanShowHeaders && direction == towardStart) {
diff --git a/leanback/leanback/src/main/java/androidx/leanback/app/BrowseSupportFragment.java b/leanback/leanback/src/main/java/androidx/leanback/app/BrowseSupportFragment.java
index d37752d..3753ec5 100644
--- a/leanback/leanback/src/main/java/androidx/leanback/app/BrowseSupportFragment.java
+++ b/leanback/leanback/src/main/java/androidx/leanback/app/BrowseSupportFragment.java
@@ -30,7 +30,6 @@
import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.core.view.ViewCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
@@ -1099,8 +1098,7 @@
? mHeadersSupportFragment.getVerticalGridView() : mMainFragment.getView();
}
- boolean isRtl = ViewCompat.getLayoutDirection(focused)
- == ViewCompat.LAYOUT_DIRECTION_RTL;
+ boolean isRtl = focused.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
int towardStart = isRtl ? View.FOCUS_RIGHT : View.FOCUS_LEFT;
int towardEnd = isRtl ? View.FOCUS_LEFT : View.FOCUS_RIGHT;
if (mCanShowHeaders && direction == towardStart) {
diff --git a/leanback/leanback/src/main/java/androidx/leanback/widget/AbstractMediaItemPresenter.java b/leanback/leanback/src/main/java/androidx/leanback/widget/AbstractMediaItemPresenter.java
index c4a0b56..bb123b4 100644
--- a/leanback/leanback/src/main/java/androidx/leanback/widget/AbstractMediaItemPresenter.java
+++ b/leanback/leanback/src/main/java/androidx/leanback/widget/AbstractMediaItemPresenter.java
@@ -28,7 +28,6 @@
import android.widget.ViewFlipper;
import androidx.annotation.NonNull;
-import androidx.core.view.ViewCompat;
import androidx.leanback.R;
import java.util.ArrayList;
@@ -593,7 +592,7 @@
.getInteger(android.R.integer.config_shortAnimTime);
DecelerateInterpolator interpolator = new DecelerateInterpolator();
- int layoutDirection = ViewCompat.getLayoutDirection(selectorView);
+ int layoutDirection = selectorView.getLayoutDirection();
if (!focusChangedView.hasFocus()) {
// if neither of the details or action views are in focus (ie. another row is in focus),
// animate the selector out.
diff --git a/leanback/leanback/src/main/java/androidx/leanback/widget/HorizontalHoverCardSwitcher.java b/leanback/leanback/src/main/java/androidx/leanback/widget/HorizontalHoverCardSwitcher.java
index 111709a..be60309 100644
--- a/leanback/leanback/src/main/java/androidx/leanback/widget/HorizontalHoverCardSwitcher.java
+++ b/leanback/leanback/src/main/java/androidx/leanback/widget/HorizontalHoverCardSwitcher.java
@@ -19,8 +19,6 @@
import android.view.ViewGroup;
import android.view.ViewGroup.MarginLayoutParams;
-import androidx.core.view.ViewCompat;
-
/**
* A helper class for showing a hover card view below a {@link HorizontalGridView}. The hover card
* is aligned to the starting edge of the selected child view. If there is no space when scrolling
@@ -48,7 +46,7 @@
// end edge with row view's end edge, otherwise align start edges.
view.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
MarginLayoutParams params = (MarginLayoutParams) view.getLayoutParams();
- boolean isRtl = ViewCompat.getLayoutDirection(view) == ViewCompat.LAYOUT_DIRECTION_RTL;
+ boolean isRtl = view.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
if (!isRtl && mCardLeft + view.getMeasuredWidth() > rightLimit) {
params.leftMargin = rightLimit - view.getMeasuredWidth();
} else if (isRtl && mCardLeft < leftLimit) {
diff --git a/leanback/leanback/src/main/java/androidx/leanback/widget/TitleHelper.java b/leanback/leanback/src/main/java/androidx/leanback/widget/TitleHelper.java
index 23c163cc..fbb3196 100644
--- a/leanback/leanback/src/main/java/androidx/leanback/widget/TitleHelper.java
+++ b/leanback/leanback/src/main/java/androidx/leanback/widget/TitleHelper.java
@@ -19,7 +19,6 @@
import android.view.View;
import android.view.ViewGroup;
-import androidx.core.view.ViewCompat;
import androidx.leanback.transition.LeanbackTransitionHelper;
import androidx.leanback.transition.TransitionHelper;
@@ -46,8 +45,7 @@
if (focused != mTitleView && direction == View.FOCUS_UP) {
return mTitleView;
}
- final boolean isRtl = ViewCompat.getLayoutDirection(focused)
- == ViewCompat.LAYOUT_DIRECTION_RTL;
+ final boolean isRtl = focused.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
final int forward = isRtl ? View.FOCUS_LEFT : View.FOCUS_RIGHT;
if (mTitleView.hasFocus() && (direction == View.FOCUS_DOWN || direction == forward)) {
return mSceneRoot;
diff --git a/libraryversions.toml b/libraryversions.toml
index 5365b3e..7cfeba5 100644
--- a/libraryversions.toml
+++ b/libraryversions.toml
@@ -94,7 +94,7 @@
LEANBACK_TAB = "1.1.0-beta01"
LEGACY = "1.1.0-alpha01"
LIBYUV = "0.1.0-dev01"
-LIFECYCLE = "2.7.0-rc01"
+LIFECYCLE = "2.8.0-alpha01"
LIFECYCLE_EXTENSIONS = "2.2.0"
LOADER = "1.2.0-alpha01"
MEDIA = "1.7.0-rc01"
@@ -161,7 +161,7 @@
WEAR_ONGOING = "1.1.0-alpha02"
WEAR_PHONE_INTERACTIONS = "1.1.0-alpha04"
WEAR_PROTOLAYOUT = "1.1.0-beta01"
-WEAR_REMOTE_INTERACTIONS = "1.1.0-alpha01"
+WEAR_REMOTE_INTERACTIONS = "1.1.0-alpha02"
WEAR_TILES = "1.3.0-beta01"
WEAR_TOOLING_PREVIEW = "1.0.0-rc01"
WEAR_WATCHFACE = "1.3.0-alpha01"
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/AbstractSavedStateViewModelFactory.kt b/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/AbstractSavedStateViewModelFactory.kt
index 7ae26bed..1fec523 100644
--- a/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/AbstractSavedStateViewModelFactory.kt
+++ b/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/AbstractSavedStateViewModelFactory.kt
@@ -17,6 +17,7 @@
import android.os.Bundle
import androidx.annotation.RestrictTo
+import androidx.lifecycle.LegacySavedStateHandleController.TAG_SAVED_STATE_HANDLE_CONTROLLER
import androidx.lifecycle.LegacySavedStateHandleController.attachHandleIfNeeded
import androidx.lifecycle.viewmodel.CreationExtras
import androidx.savedstate.SavedStateRegistry
@@ -40,8 +41,7 @@
* Constructs this factory.
*
* When a factory is constructed this way, a component for which [SavedStateHandle] is
- * scoped must have called
- * [SavedStateHandleSupport.enableSavedStateHandles].
+ * scoped must have called [enableSavedStateHandles].
* See [CreationExtras.createSavedStateHandle] docs for more
* details.
*/
@@ -148,9 +148,4 @@
attachHandleIfNeeded(viewModel, savedStateRegistry!!, lifecycle!!)
}
}
-
- internal companion object {
- internal const val TAG_SAVED_STATE_HANDLE_CONTROLLER =
- "androidx.lifecycle.savedstate.vm.tag"
- }
}
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateViewModelFactory.kt b/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateViewModelFactory.kt
index 42e40ec..d9794ef 100644
--- a/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateViewModelFactory.kt
+++ b/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateViewModelFactory.kt
@@ -182,7 +182,7 @@
newInstance(modelClass, constructor, controller.handle)
}
viewModel.setTagIfAbsent(
- AbstractSavedStateViewModelFactory.TAG_SAVED_STATE_HANDLE_CONTROLLER, controller
+ LegacySavedStateHandleController.TAG_SAVED_STATE_HANDLE_CONTROLLER, controller
)
return viewModel
}
diff --git a/media2/media2-widget/src/androidTest/java/androidx/media2/widget/MediaWidgetTestBase.java b/media2/media2-widget/src/androidTest/java/androidx/media2/widget/MediaWidgetTestBase.java
index fcf4b40..675beea 100644
--- a/media2/media2-widget/src/androidTest/java/androidx/media2/widget/MediaWidgetTestBase.java
+++ b/media2/media2-widget/src/androidTest/java/androidx/media2/widget/MediaWidgetTestBase.java
@@ -28,7 +28,6 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
-import androidx.core.view.ViewCompat;
import androidx.media2.widget.test.R;
import androidx.test.core.app.ApplicationProvider;
@@ -74,7 +73,7 @@
}
static void checkAttachedToWindow(View view) throws Exception {
- if (!ViewCompat.isAttachedToWindow(view)) {
+ if (!view.isAttachedToWindow()) {
final CountDownLatch latch = new CountDownLatch(1);
View.OnAttachStateChangeListener listener = new View.OnAttachStateChangeListener() {
@Override
diff --git a/media2/media2-widget/src/main/java/androidx/media2/widget/ClosedCaptionWidget.java b/media2/media2-widget/src/main/java/androidx/media2/widget/ClosedCaptionWidget.java
index 32f9c3a..c6435af 100644
--- a/media2/media2-widget/src/main/java/androidx/media2/widget/ClosedCaptionWidget.java
+++ b/media2/media2-widget/src/main/java/androidx/media2/widget/ClosedCaptionWidget.java
@@ -23,8 +23,6 @@
import android.view.accessibility.CaptioningManager;
import android.view.accessibility.CaptioningManager.CaptioningChangeListener;
-import androidx.core.view.ViewCompat;
-
/**
* Abstract widget class to render a closed caption track.
*/
@@ -147,7 +145,7 @@
*/
private void manageChangeListener() {
final boolean needsListener =
- ViewCompat.isAttachedToWindow(this) && getVisibility() == View.VISIBLE;
+ this.isAttachedToWindow() && getVisibility() == View.VISIBLE;
if (mHasChangeListener != needsListener) {
mHasChangeListener = needsListener;
diff --git a/media2/media2-widget/src/main/java/androidx/media2/widget/MediaControlView.java b/media2/media2-widget/src/main/java/androidx/media2/widget/MediaControlView.java
index 6ef9ac9..2cf20b4 100644
--- a/media2/media2-widget/src/main/java/androidx/media2/widget/MediaControlView.java
+++ b/media2/media2-widget/src/main/java/androidx/media2/widget/MediaControlView.java
@@ -51,7 +51,6 @@
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.core.content.ContextCompat;
-import androidx.core.view.ViewCompat;
import java.util.ArrayList;
import java.util.Arrays;
@@ -359,7 +358,7 @@
}
mPlayer = new PlayerWrapper(controller, ContextCompat.getMainExecutor(getContext()),
new PlayerCallback());
- if (ViewCompat.isAttachedToWindow(this)) {
+ if (this.isAttachedToWindow()) {
mPlayer.attachCallback();
}
}
@@ -396,7 +395,7 @@
}
mPlayer = new PlayerWrapper(player, ContextCompat.getMainExecutor(getContext()),
new PlayerCallback());
- if (ViewCompat.isAttachedToWindow(this)) {
+ if (this.isAttachedToWindow()) {
mPlayer.attachCallback();
}
}
diff --git a/media2/media2-widget/src/main/java/androidx/media2/widget/SubtitleAnchorView.java b/media2/media2-widget/src/main/java/androidx/media2/widget/SubtitleAnchorView.java
index 36679e7..33c6be7 100644
--- a/media2/media2-widget/src/main/java/androidx/media2/widget/SubtitleAnchorView.java
+++ b/media2/media2-widget/src/main/java/androidx/media2/widget/SubtitleAnchorView.java
@@ -24,7 +24,6 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.core.view.ViewCompat;
import androidx.media2.widget.SubtitleController.Anchor;
import androidx.media2.widget.SubtitleTrack.RenderingWidget;
@@ -52,7 +51,7 @@
return;
}
- final boolean attachedToWindow = ViewCompat.isAttachedToWindow(this);
+ final boolean attachedToWindow = this.isAttachedToWindow();
if (mSubtitleWidget != null) {
if (attachedToWindow) {
mSubtitleWidget.onDetachedFromWindow();
diff --git a/media2/media2-widget/src/main/java/androidx/media2/widget/VideoView.java b/media2/media2-widget/src/main/java/androidx/media2/widget/VideoView.java
index 20d4008..7027695 100644
--- a/media2/media2-widget/src/main/java/androidx/media2/widget/VideoView.java
+++ b/media2/media2-widget/src/main/java/androidx/media2/widget/VideoView.java
@@ -30,7 +30,6 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
-import androidx.core.view.ViewCompat;
import androidx.palette.graphics.Palette;
import com.google.common.util.concurrent.ListenableFuture;
@@ -398,7 +397,7 @@
}
mPlayer = new PlayerWrapper(controller, ContextCompat.getMainExecutor(getContext()),
new PlayerCallback());
- if (ViewCompat.isAttachedToWindow(this)) {
+ if (this.isAttachedToWindow()) {
mPlayer.attachCallback();
}
if (this.isAggregatedVisible()) {
@@ -435,7 +434,7 @@
}
mPlayer = new PlayerWrapper(player, ContextCompat.getMainExecutor(getContext()),
new PlayerCallback());
- if (ViewCompat.isAttachedToWindow(this)) {
+ if (this.isAttachedToWindow()) {
mPlayer.attachCallback();
}
if (this.isAggregatedVisible()) {
diff --git a/paging/paging-common/src/commonJvmAndroidMain/kotlin/androidx/paging/PagedStorage.jvm.kt b/paging/paging-common/src/commonJvmAndroidMain/kotlin/androidx/paging/PagedStorage.jvm.kt
index ffd5abf..b727765 100644
--- a/paging/paging-common/src/commonJvmAndroidMain/kotlin/androidx/paging/PagedStorage.jvm.kt
+++ b/paging/paging-common/src/commonJvmAndroidMain/kotlin/androidx/paging/PagedStorage.jvm.kt
@@ -166,8 +166,8 @@
/**
* Walk through the list of pages to find the data at local index
*/
- override fun getFromStorage(localIndex: Int): T =
- traversePages(localIndex) { page, pageInternalIndex ->
+ override fun getItem(index: Int): T =
+ traversePages(index) { page, pageInternalIndex ->
page.data[pageInternalIndex]
}
@@ -199,7 +199,7 @@
index < 0 || index >= size ->
throw IndexOutOfBoundsException("Index: $index, Size: $size")
localIndex < 0 || localIndex >= dataCount -> null
- else -> getFromStorage(localIndex)
+ else -> getItem(localIndex)
}
}
diff --git a/paging/paging-common/src/commonMain/kotlin/androidx/paging/MutableCombinedLoadStateCollection.kt b/paging/paging-common/src/commonMain/kotlin/androidx/paging/MutableCombinedLoadStateCollection.kt
index 755c80d..9bd6f0f 100644
--- a/paging/paging-common/src/commonMain/kotlin/androidx/paging/MutableCombinedLoadStateCollection.kt
+++ b/paging/paging-common/src/commonMain/kotlin/androidx/paging/MutableCombinedLoadStateCollection.kt
@@ -39,18 +39,20 @@
private val _stateFlow = MutableStateFlow<CombinedLoadStates?>(null)
public val stateFlow = _stateFlow.asStateFlow()
+ // load states are de-duplicated
fun set(sourceLoadStates: LoadStates, remoteLoadStates: LoadStates?) =
dispatchNewState { currState ->
computeNewState(currState, sourceLoadStates, remoteLoadStates)
}
+ // load states are de-duplicated
fun set(type: LoadType, remote: Boolean, state: LoadState) =
dispatchNewState { currState ->
var source = currState?.source ?: LoadStates.IDLE
- var mediator = currState?.mediator ?: LoadStates.IDLE
+ var mediator = currState?.mediator
if (remote) {
- mediator = mediator.modifyState(type, state)
+ mediator = LoadStates.IDLE.modifyState(type, state)
} else {
source = source.modifyState(type, state)
}
diff --git a/paging/paging-common/src/commonMain/kotlin/androidx/paging/NullPaddedList.kt b/paging/paging-common/src/commonMain/kotlin/androidx/paging/NullPaddedList.kt
index 0aade5b..f434749 100644
--- a/paging/paging-common/src/commonMain/kotlin/androidx/paging/NullPaddedList.kt
+++ b/paging/paging-common/src/commonMain/kotlin/androidx/paging/NullPaddedList.kt
@@ -26,8 +26,8 @@
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public interface NullPaddedList<T> {
public val placeholdersBefore: Int
- public fun getFromStorage(localIndex: Int): T
public val placeholdersAfter: Int
public val size: Int
public val dataCount: Int
+ public fun getItem(index: Int): T
}
diff --git a/paging/paging-common/src/commonMain/kotlin/androidx/paging/PageStore.kt b/paging/paging-common/src/commonMain/kotlin/androidx/paging/PageStore.kt
index 972907a..bc9a9fd 100644
--- a/paging/paging-common/src/commonMain/kotlin/androidx/paging/PageStore.kt
+++ b/paging/paging-common/src/commonMain/kotlin/androidx/paging/PageStore.kt
@@ -16,7 +16,6 @@
package androidx.paging
-import androidx.paging.LoadState.NotLoading
import androidx.paging.LoadType.APPEND
import androidx.paging.LoadType.PREPEND
import androidx.paging.LoadType.REFRESH
@@ -59,7 +58,7 @@
}
override fun toString(): String {
- val items = List(dataCount) { getFromStorage(it) }.joinToString()
+ val items = List(dataCount) { getItem(it) }.joinToString()
return "[($placeholdersBefore placeholders), $items, ($placeholdersAfter placeholders)]"
}
@@ -70,7 +69,7 @@
if (localIndex < 0 || localIndex >= dataCount) {
return null
}
- return getFromStorage(localIndex)
+ return getItem(localIndex)
}
fun snapshot(): ItemSnapshotList<T> {
@@ -81,9 +80,9 @@
)
}
- override fun getFromStorage(localIndex: Int): T {
+ override fun getItem(index: Int): T {
var pageIndex = 0
- var indexInPage = localIndex
+ var indexInPage = index
// Since we don't know if page sizes are regular, we walk to correct page.
val localPageCount = pages.size
@@ -263,13 +262,6 @@
if (changeCount > 0) {
callback.onChanged(firstItemIndex, changeCount)
}
-
- // Dropping from prepend direction implies NotLoading(endOfPaginationReached = false).
- callback.onStateUpdate(
- loadType = PREPEND,
- fromMediator = false,
- loadState = NotLoading.Incomplete
- )
} else {
val oldPlaceholdersAfter = placeholdersAfter
@@ -306,13 +298,6 @@
count = changeCount
)
}
-
- // Dropping from append direction implies NotLoading(endOfPaginationReached = false).
- callback.onStateUpdate(
- loadType = APPEND,
- fromMediator = false,
- loadState = NotLoading.Incomplete
- )
}
}
diff --git a/paging/paging-common/src/commonMain/kotlin/androidx/paging/PagingDataEvent.kt b/paging/paging-common/src/commonMain/kotlin/androidx/paging/PagingDataEvent.kt
index a9cc5ec..3ce3bc5 100644
--- a/paging/paging-common/src/commonMain/kotlin/androidx/paging/PagingDataEvent.kt
+++ b/paging/paging-common/src/commonMain/kotlin/androidx/paging/PagingDataEvent.kt
@@ -57,4 +57,18 @@
val newPlaceholdersAfter: Int,
val oldPlaceholdersAfter: Int,
) : PagingDataEvent<T>()
+
+ /**
+ * A refresh load event
+ *
+ * @param [newList] A [NullPaddedList] that contains the metadata of the new list
+ * that is presented upon this refresh event
+ *
+ * @param [previousList] A [NullPaddedList] that contains the metadata of the list
+ * presented prior to this refresh load event
+ */
+ public class Refresh<T : Any> @RestrictTo(LIBRARY_GROUP) constructor(
+ val newList: NullPaddedList<T>,
+ val previousList: NullPaddedList<T>,
+ ) : PagingDataEvent<T>()
}
diff --git a/paging/paging-common/src/commonMain/kotlin/androidx/paging/PagingDataPresenter.kt b/paging/paging-common/src/commonMain/kotlin/androidx/paging/PagingDataPresenter.kt
index 8b4becd..a173a9e 100644
--- a/paging/paging-common/src/commonMain/kotlin/androidx/paging/PagingDataPresenter.kt
+++ b/paging/paging-common/src/commonMain/kotlin/androidx/paging/PagingDataPresenter.kt
@@ -25,7 +25,6 @@
import androidx.paging.PageEvent.Insert
import androidx.paging.PageEvent.StaticList
import androidx.paging.PageStore.ProcessPageEventCallback
-import androidx.paging.internal.BUGANIZER_URL
import androidx.paging.internal.CopyOnWriteArrayList
import androidx.paging.internal.appendMediatorStatesIfNotNull
import kotlin.coroutines.CoroutineContext
@@ -90,7 +89,7 @@
// for state updates from LoadStateUpdate events
override fun onStateUpdate(source: LoadStates, mediator: LoadStates?) {
- dispatchLoadStates(source, mediator)
+ combinedLoadStatesCollection.set(source, mediator)
}
// for state updates from Drop events
@@ -104,38 +103,9 @@
}
}
- private fun dispatchLoadStates(source: LoadStates, mediator: LoadStates?) {
- // CombinedLoadStates is de-duplicated within set()
- combinedLoadStatesCollection.set(
- sourceLoadStates = source,
- remoteLoadStates = mediator
- )
- }
-
- /**
- * @param onListPresentable Call this synchronously right before dispatching updates to signal
- * that this [PagingDataPresenter] should now consider [newList] as the presented list for
- * presenter-level APIs such as [snapshot] and [peek]. This should be called before notifying
- * any callbacks that the user would expect to be synchronous with pageStore updates, such as
- * `ListUpdateCallback`, in case it's desirable to inspect pageStore state within those
- * callbacks.
- *
- * @return Transformed result of [lastAccessedIndex] as an index of [newList] using the diff
- * result between [previousList] and [newList]. Null if [newList] or [previousList] lists are
- * empty, where it does not make sense to transform [lastAccessedIndex].
- */
- // TODO("To be removed when all PageEvent types have moved to presentPagingDataEvent")
- public abstract suspend fun presentNewList(
- previousList: NullPaddedList<T>,
- newList: NullPaddedList<T>,
- lastAccessedIndex: Int,
- onListPresentable: () -> Unit,
- )
-
/**
* Handler for [PagingDataEvent] emitted by a [PagingData] that was submitted to
* this [PagingDataPresenter]
- *
*/
public abstract suspend fun presentPagingDataEvent(
event: PagingDataEvent<T>,
@@ -202,9 +172,9 @@
presentPagingDataEvent(pageStore.processEvent(event))
// dispatch load states
- dispatchLoadStates(
- source = event.sourceLoadStates,
- mediator = event.mediatorLoadStates,
+ combinedLoadStatesCollection.set(
+ sourceLoadStates = event.sourceLoadStates,
+ remoteLoadStates = event.mediatorLoadStates,
)
// If index points to a placeholder after transformations, resend it unless
@@ -254,17 +224,24 @@
yield()
}
- // Process DROP to be shown to the UI
+ // Process DROP and send to presenter
pageStore.processEvent(event, processPageEventCallback)
+ // dispatch load states
+ combinedLoadStatesCollection.set(
+ type = event.loadType,
+ remote = false,
+ state = LoadState.NotLoading.Incomplete
+ )
+
// Reset lastAccessedIndexUnfulfilled if a page is dropped, to avoid
// infinite loops when maxSize is insufficiently large.
lastAccessedIndexUnfulfilled = false
}
event is PageEvent.LoadStateUpdate ->
- processPageEventCallback.onStateUpdate(
- source = event.source,
- mediator = event.mediator,
+ combinedLoadStatesCollection.set(
+ sourceLoadStates = event.source,
+ remoteLoadStates = event.mediator,
)
}
// Notify page updates after pageStore processes them.
@@ -478,23 +455,29 @@
lastAccessedIndexUnfulfilled = false
- val newPresenter = PageStore(
+ val newPageStore = PageStore(
pages = pages,
placeholdersBefore = placeholdersBefore,
placeholdersAfter = placeholdersAfter,
)
- var onListPresentableCalled = false
- presentNewList(
- previousList = pageStore,
- newList = newPresenter,
- lastAccessedIndex = lastAccessedIndex,
- onListPresentable = {
- pageStore = newPresenter
- onListPresentableCalled = true
- hintReceiver = newHintReceiver
- log(DEBUG) {
- appendMediatorStatesIfNotNull(mediatorLoadStates) {
- """Presenting data:
+ // must capture previousList states here before we update pageStore
+ val previousList = pageStore as NullPaddedList<T>
+
+ // update the store here before event is sent to ensure that snapshot() returned in
+ // UI update callbacks (onChanged, onInsert etc) reflects the new list
+ pageStore = newPageStore
+ hintReceiver = newHintReceiver
+
+ // send event to UI
+ presentPagingDataEvent(
+ PagingDataEvent.Refresh(
+ newList = newPageStore as NullPaddedList<T>,
+ previousList = previousList,
+ )
+ )
+ log(DEBUG) {
+ appendMediatorStatesIfNotNull(mediatorLoadStates) {
+ """Presenting data:
| first item: ${pages.firstOrNull()?.data?.firstOrNull()}
| last item: ${pages.lastOrNull()?.data?.lastOrNull()}
| placeholdersBefore: $placeholdersBefore
@@ -502,31 +485,21 @@
| hintReceiver: $newHintReceiver
| sourceLoadStates: $sourceLoadStates
"""
- }
- }
}
- )
- check(onListPresentableCalled) {
- """Missing call to onListPresentable after new list was presented. If you are seeing
- | this exception, it is generally an indication of an issue with Paging.
- | Please file a bug so we can fix it at:
- | $BUGANIZER_URL""".trimMargin()
}
-
// We may want to skip dispatching load states if triggered by a static list which wants to
// preserve the previous state.
if (dispatchLoadStates) {
// Dispatch LoadState updates as soon as we are done diffing, but after
// setting new pageStore.
- dispatchLoadStates(sourceLoadStates!!, mediatorLoadStates)
+ combinedLoadStatesCollection.set(sourceLoadStates!!, mediatorLoadStates)
}
-
- if (newPresenter.size == 0) {
+ if (newPageStore.size == 0) {
// Send an initialize hint in case the new list is empty (no items or placeholders),
// which would prevent a ViewportHint.Access from ever getting sent since there are
// no items to bind from initial load. Without this hint, paging would stall on
// an empty list because prepend/append would be not triggered.
- hintReceiver?.accessHint(newPresenter.initializeHint())
+ hintReceiver?.accessHint(newPageStore.initializeHint())
}
}
}
diff --git a/paging/paging-common/src/commonTest/kotlin/androidx/paging/PageStoreTest.kt b/paging/paging-common/src/commonTest/kotlin/androidx/paging/PageStoreTest.kt
index e19d32e..5b37246 100644
--- a/paging/paging-common/src/commonTest/kotlin/androidx/paging/PageStoreTest.kt
+++ b/paging/paging-common/src/commonTest/kotlin/androidx/paging/PageStoreTest.kt
@@ -17,7 +17,6 @@
package androidx.paging
import androidx.kruth.assertThat
-import androidx.paging.LoadState.NotLoading
import androidx.paging.LoadType.APPEND
import androidx.paging.LoadType.PREPEND
import androidx.paging.PageStore.ProcessPageEventCallback
@@ -244,9 +243,7 @@
callback = callback
)
- assertThat(callback.getAllAndClear()).isEqualTo(
- events + listOf(StateEvent(APPEND, false, NotLoading.Incomplete))
- )
+ assertThat(callback.getAllAndClear()).isEqualTo(events)
// assert final list state
val finalData = initialPages.subList(0, initialPages.size - pagesToDrop).flatten()
@@ -285,9 +282,7 @@
callback = callback
)
- assertThat(callback.getAllAndClear()).isEqualTo(
- events + listOf(StateEvent(PREPEND, false, NotLoading.Incomplete))
- )
+ assertThat(callback.getAllAndClear()).isEqualTo(events)
// assert final list state
val finalData = initialPages.take(initialPages.size - pagesToDrop).reversed().flatten()
diff --git a/paging/paging-common/src/commonTest/kotlin/androidx/paging/PagingDataPresenterTest.kt b/paging/paging-common/src/commonTest/kotlin/androidx/paging/PagingDataPresenterTest.kt
index 5d92823..dd61ec5 100644
--- a/paging/paging-common/src/commonTest/kotlin/androidx/paging/PagingDataPresenterTest.kt
+++ b/paging/paging-common/src/commonTest/kotlin/androidx/paging/PagingDataPresenterTest.kt
@@ -1584,6 +1584,58 @@
}
@Test
+ fun appendDrop_loadStates() = appendDrop_loadStates(false)
+
+ @Test
+ fun appendDrop_loadStates_collectWithCachedIn() = appendDrop_loadStates(true)
+
+ private fun appendDrop_loadStates(collectWithCachedIn: Boolean) =
+ runTest(
+ collectWithCachedIn,
+ initialKey = 96,
+ config = PagingConfig(
+ pageSize = 1,
+ maxSize = 4,
+ enablePlaceholders = false
+ )
+ ) { presenter, _, _, _ ->
+ val collectLoadStates = launch { presenter.collectLoadStates() }
+
+ // initial REFRESH
+ advanceUntilIdle()
+
+ assertThat(presenter.snapshot()).containsExactlyElementsIn(96 until 99)
+ assertThat(presenter.newCombinedLoadStates()).containsExactly(
+ localLoadStatesOf(refreshLocal = Loading),
+ // ensure append has reached end of pagination
+ localLoadStatesOf(),
+ )
+
+ // trigger append to reach max page size
+ presenter[2]
+ advanceUntilIdle()
+
+ assertThat(presenter.snapshot()).containsExactlyElementsIn(96 until 100)
+ assertThat(presenter.newCombinedLoadStates()).containsExactly(
+ localLoadStatesOf(appendLocal = Loading),
+ localLoadStatesOf(appendLocal = NotLoading.Complete),
+ )
+
+ // trigger prepend and drop from append direction
+ presenter[0]
+ advanceUntilIdle()
+
+ assertThat(presenter.snapshot()).containsExactlyElementsIn(95 until 99)
+ assertThat(presenter.newCombinedLoadStates()).containsExactly(
+ localLoadStatesOf(prependLocal = Loading, appendLocal = NotLoading.Complete),
+ // page from the end is dropped so now appendLocal should be NotLoading.Incomplete
+ localLoadStatesOf(prependLocal = Loading),
+ localLoadStatesOf(),
+ )
+ collectLoadStates.cancel()
+ }
+
+ @Test
fun prependInvalid_loadStates() = prependInvalid_loadStates(false)
@Test
@@ -1644,6 +1696,59 @@
}
@Test
+ fun prependDrop_loadStates() = prependDrop_loadStates(false)
+
+ @Test
+ fun prependDrop_loadStates_collectWithCachedIn() = prependDrop_loadStates(true)
+
+ private fun prependDrop_loadStates(collectWithCachedIn: Boolean) =
+ runTest(
+ collectWithCachedIn,
+ initialKey = 1,
+ config = PagingConfig(
+ pageSize = 1,
+ maxSize = 4,
+ enablePlaceholders = false
+ )
+ ) { presenter, _, _, _ ->
+ val collectLoadStates = launch { presenter.collectLoadStates() }
+
+ // initial REFRESH
+ advanceUntilIdle()
+
+ assertThat(presenter.snapshot()).containsExactlyElementsIn(1 until 4)
+ assertThat(presenter.newCombinedLoadStates()).containsExactly(
+ localLoadStatesOf(refreshLocal = Loading),
+ // ensure append has reached end of pagination
+ localLoadStatesOf(),
+ )
+
+ // trigger prepend to reach max page size
+ presenter[0]
+ advanceUntilIdle()
+
+ assertThat(presenter.snapshot()).containsExactlyElementsIn(0 until 4)
+ assertThat(presenter.newCombinedLoadStates()).containsExactly(
+ localLoadStatesOf(prependLocal = Loading),
+ localLoadStatesOf(prependLocal = NotLoading.Complete),
+ )
+
+ // trigger append and drop from prepend direction
+ presenter[3]
+ advanceUntilIdle()
+
+ assertThat(presenter.snapshot()).containsExactlyElementsIn(1 until 5)
+ assertThat(presenter.newCombinedLoadStates()).containsExactly(
+ localLoadStatesOf(prependLocal = NotLoading.Complete, appendLocal = Loading),
+ // first page is dropped so now prependLocal should be NotLoading.Incomplete
+ localLoadStatesOf(appendLocal = Loading),
+ localLoadStatesOf(),
+ )
+
+ collectLoadStates.cancel()
+ }
+
+ @Test
fun refreshInvalid_loadStates() = refreshInvalid_loadStates(false)
@Test
@@ -2211,6 +2316,7 @@
private fun runTest(
collectWithCachedIn: Boolean,
initialKey: Int? = null,
+ config: PagingConfig = PagingConfig(pageSize = 3, enablePlaceholders = false),
block: TestScope.(
presenter: SimplePresenter,
pagingSources: List<TestPagingSource>,
@@ -2220,7 +2326,7 @@
) = testScope.runTest {
val pagingSources = mutableListOf<TestPagingSource>()
val pager = Pager(
- config = PagingConfig(pageSize = 3, enablePlaceholders = false),
+ config = config,
initialKey = initialKey,
pagingSourceFactory = {
TestPagingSource(
@@ -2367,15 +2473,6 @@
mainContext = EmptyCoroutineContext,
cachedPagingData = cachedPagingData
) {
- override suspend fun presentNewList(
- previousList: NullPaddedList<Int>,
- newList: NullPaddedList<Int>,
- lastAccessedIndex: Int,
- onListPresentable: () -> Unit
- ) {
- onListPresentable()
- }
-
private val _localLoadStates = mutableListOf<CombinedLoadStates>()
val nonNullLoadStateFlow = loadStateFlow.filterNotNull()
diff --git a/paging/paging-compose/src/commonMain/kotlin/androidx/paging/compose/LazyPagingItems.kt b/paging/paging-compose/src/commonMain/kotlin/androidx/paging/compose/LazyPagingItems.kt
index 0aaee56..464d6cd 100644
--- a/paging/paging-compose/src/commonMain/kotlin/androidx/paging/compose/LazyPagingItems.kt
+++ b/paging/paging-compose/src/commonMain/kotlin/androidx/paging/compose/LazyPagingItems.kt
@@ -29,7 +29,6 @@
import androidx.paging.ItemSnapshotList
import androidx.paging.LoadState
import androidx.paging.LoadStates
-import androidx.paging.NullPaddedList
import androidx.paging.PagingData
import androidx.paging.PagingDataEvent
import androidx.paging.PagingDataPresenter
@@ -95,16 +94,6 @@
cachedPagingData =
if (flow is SharedFlow<PagingData<T>>) flow.replayCache.firstOrNull() else null
) {
- override suspend fun presentNewList(
- previousList: NullPaddedList<T>,
- newList: NullPaddedList<T>,
- lastAccessedIndex: Int,
- onListPresentable: () -> Unit
- ) {
- onListPresentable()
- updateItemSnapshotList()
- }
-
override suspend fun presentPagingDataEvent(
event: PagingDataEvent<T>,
) {
diff --git a/paging/paging-runtime/src/androidTest/java/androidx/paging/NullPaddedListDiffHelperTest.kt b/paging/paging-runtime/src/androidTest/java/androidx/paging/NullPaddedListDiffHelperTest.kt
index 622f4f5..6b27bef 100644
--- a/paging/paging-runtime/src/androidTest/java/androidx/paging/NullPaddedListDiffHelperTest.kt
+++ b/paging/paging-runtime/src/androidTest/java/androidx/paging/NullPaddedListDiffHelperTest.kt
@@ -39,7 +39,7 @@
private val data: List<String>,
override val placeholdersAfter: Int
) : NullPaddedList<String> {
- override fun getFromStorage(localIndex: Int): String = data[localIndex]
+ override fun getItem(index: Int): String = data[index]
override val size: Int
get() = placeholdersBefore + data.size + placeholdersAfter
override val dataCount: Int
diff --git a/paging/paging-runtime/src/androidTest/java/androidx/paging/NullPaddedListDiffWithRecyclerViewTest.kt b/paging/paging-runtime/src/androidTest/java/androidx/paging/NullPaddedListDiffWithRecyclerViewTest.kt
index d6216d5..bc35df8 100644
--- a/paging/paging-runtime/src/androidTest/java/androidx/paging/NullPaddedListDiffWithRecyclerViewTest.kt
+++ b/paging/paging-runtime/src/androidTest/java/androidx/paging/NullPaddedListDiffWithRecyclerViewTest.kt
@@ -419,7 +419,7 @@
val pre = randomNullPaddedStorage(0)
val post = randomNullPaddedStorage(
startId = if (pre.dataCount > 0) {
- pre.getFromStorage(rand.nextInt(pre.dataCount)).id
+ pre.getItem(rand.nextInt(pre.dataCount)).id
} else {
0
}
@@ -621,7 +621,7 @@
""".trimIndent()
}
- override fun getFromStorage(localIndex: Int): NullPaddedListItem = data[localIndex]
+ override fun getItem(index: Int): NullPaddedListItem = data[index]
override val size: Int
get() = placeholdersBefore + data.size + placeholdersAfter
@@ -822,7 +822,7 @@
if (index < placeholdersBefore) return null
val storageIndex = index - placeholdersBefore
if (storageIndex >= dataCount) return null
- return getFromStorage(storageIndex)
+ return getItem(storageIndex)
}
/**
diff --git a/paging/paging-runtime/src/main/java/androidx/paging/AsyncPagingDataDiffer.kt b/paging/paging-runtime/src/main/java/androidx/paging/AsyncPagingDataDiffer.kt
index e3045cb..c92db54 100644
--- a/paging/paging-runtime/src/main/java/androidx/paging/AsyncPagingDataDiffer.kt
+++ b/paging/paging-runtime/src/main/java/androidx/paging/AsyncPagingDataDiffer.kt
@@ -162,35 +162,6 @@
internal var inGetItem: Boolean = false
internal val presenter = object : PagingDataPresenter<T>(differCallback, mainDispatcher) {
- // TODO("To be removed when all PageEvent types have moved to presentPagingDataEvent")
- override suspend fun presentNewList(
- previousList: NullPaddedList<T>,
- newList: NullPaddedList<T>,
- lastAccessedIndex: Int,
- onListPresentable: () -> Unit,
- ) {
- when {
- // fast path for no items -> some items
- previousList.size == 0 -> {
- onListPresentable()
- differCallback.onInserted(0, newList.size)
- }
- // fast path for some items -> no items
- newList.size == 0 -> {
- onListPresentable()
- differCallback.onRemoved(0, previousList.size)
- }
-
- else -> {
- val diffResult = withContext(workerDispatcher) {
- previousList.computeDiff(newList, diffCallback)
- }
- onListPresentable()
- previousList.dispatchDiff(updateCallback, newList, diffResult)
- }
- }
- }
-
/**
* Insert the event's page to the storage, and dispatch associated callbacks for
* change (placeholder becomes real item) or insert (real item is appended).
@@ -211,6 +182,25 @@
*/
override suspend fun presentPagingDataEvent(event: PagingDataEvent<T>) {
when (event) {
+ is PagingDataEvent.Refresh -> event.apply {
+ when {
+ // fast path for no items -> some items
+ previousList.size == 0 -> {
+ differCallback.onInserted(0, newList.size)
+ }
+ // fast path for some items -> no items
+ newList.size == 0 -> {
+ differCallback.onRemoved(0, previousList.size)
+ }
+
+ else -> {
+ val diffResult = withContext(workerDispatcher) {
+ previousList.computeDiff(newList, diffCallback)
+ }
+ previousList.dispatchDiff(updateCallback, newList, diffResult)
+ }
+ }
+ }
is PagingDataEvent.Prepend -> event.apply {
val insertSize = inserted.size
diff --git a/paging/paging-runtime/src/main/java/androidx/paging/NullPaddedListDiffHelper.kt b/paging/paging-runtime/src/main/java/androidx/paging/NullPaddedListDiffHelper.kt
index 13a3a86..bc332f1 100644
--- a/paging/paging-runtime/src/main/java/androidx/paging/NullPaddedListDiffHelper.kt
+++ b/paging/paging-runtime/src/main/java/androidx/paging/NullPaddedListDiffHelper.kt
@@ -45,8 +45,8 @@
val diffResult = DiffUtil.calculateDiff(
object : DiffUtil.Callback() {
override fun getChangePayload(oldItemPosition: Int, newItemPosition: Int): Any? {
- val oldItem = getFromStorage(oldItemPosition)
- val newItem = newList.getFromStorage(newItemPosition)
+ val oldItem = getItem(oldItemPosition)
+ val newItem = newList.getItem(newItemPosition)
return when {
oldItem === newItem -> true
@@ -59,8 +59,8 @@
override fun getNewListSize() = newSize
override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
- val oldItem = getFromStorage(oldItemPosition)
- val newItem = newList.getFromStorage(newItemPosition)
+ val oldItem = getItem(oldItemPosition)
+ val newItem = newList.getItem(newItemPosition)
return when {
oldItem === newItem -> true
@@ -69,8 +69,8 @@
}
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
- val oldItem = getFromStorage(oldItemPosition)
- val newItem = newList.getFromStorage(newItemPosition)
+ val oldItem = getItem(oldItemPosition)
+ val newItem = newList.getItem(newItemPosition)
return when {
oldItem === newItem -> true
diff --git a/paging/paging-testing/src/commonMain/kotlin/androidx/paging/testing/PagerFlowSnapshot.kt b/paging/paging-testing/src/commonMain/kotlin/androidx/paging/testing/PagerFlowSnapshot.kt
index f50eae6..c8b1d3f 100644
--- a/paging/paging-testing/src/commonMain/kotlin/androidx/paging/testing/PagerFlowSnapshot.kt
+++ b/paging/paging-testing/src/commonMain/kotlin/androidx/paging/testing/PagerFlowSnapshot.kt
@@ -22,7 +22,6 @@
import androidx.paging.ItemSnapshotList
import androidx.paging.LoadState
import androidx.paging.LoadStates
-import androidx.paging.NullPaddedList
import androidx.paging.Pager
import androidx.paging.PagingData
import androidx.paging.PagingDataEvent
@@ -72,37 +71,31 @@
val presenter = object : CompletablePagingDataPresenter<Value>(
callback, coroutineContext
) {
- override suspend fun presentNewList(
- previousList: NullPaddedList<Value>,
- newList: NullPaddedList<Value>,
- lastAccessedIndex: Int,
- onListPresentable: () -> Unit
- ) {
- onListPresentable()
- /**
- * On new generation, SnapshotLoader needs the latest [ItemSnapshotList]
- * state so that it can initialize lastAccessedIndex to prepend/append from onwards.
- *
- * This initial lastAccessedIndex is necessary because initial load
- * key may not be 0, for example when [Pager].initialKey != 0. We don't know which
- * items are immediately displayed so we can only best-effort estimate that the middle
- * item has been presented.
- *
- * Therefore we calculate the actual index based on
- * [ItemSnapshotList.placeholdersBefore] + [1/2 initial load size].
- *
- * Any subsequent SnapshotLoader loads are based on the index tracked by
- * [SnapshotLoader] internally.
- */
- val lastLoadedIndex = newList.placeholdersBefore + (newList.dataCount / 2)
- loader.onDataSetChanged(
- loader.generations.value,
- LoaderCallback(LoadType.REFRESH, lastLoadedIndex, newList.size),
- this@coroutineScope
- )
- }
-
override suspend fun presentPagingDataEvent(event: PagingDataEvent<Value>) {
+ if (event is PagingDataEvent.Refresh) {
+ /**
+ * On new generation, SnapshotLoader needs the latest [ItemSnapshotList]
+ * state so that it can initialize lastAccessedIndex to prepend/append from onwards.
+ *
+ * This initial lastAccessedIndex is necessary because initial load
+ * key may not be 0, for example when [Pager].initialKey != 0. We don't know which
+ * items are immediately displayed so we can only best-effort estimate that the middle
+ * item has been presented.
+ *
+ * Therefore we calculate the actual index based on
+ * [ItemSnapshotList.placeholdersBefore] + [1/2 initial load size].
+ *
+ * Any subsequent SnapshotLoader loads are based on the index tracked by
+ * [SnapshotLoader] internally.
+ */
+ val lastLoadedIndex = event.newList.placeholdersBefore +
+ (event.newList.dataCount / 2)
+ loader.onDataSetChanged(
+ loader.generations.value,
+ LoaderCallback(LoadType.REFRESH, lastLoadedIndex, event.newList.size),
+ this@coroutineScope
+ )
+ }
/**
* We only care about callbacks for prepend inserts so that we can adjust
* the lastAccessedIndex. For more detail, refer to docs on method
diff --git a/percentlayout/percentlayout/src/androidTest/java/androidx/percentlayout/widget/PercentFrameTest.java b/percentlayout/percentlayout/src/androidTest/java/androidx/percentlayout/widget/PercentFrameTest.java
index f4bf9ee..f1006c9 100644
--- a/percentlayout/percentlayout/src/androidTest/java/androidx/percentlayout/widget/PercentFrameTest.java
+++ b/percentlayout/percentlayout/src/androidTest/java/androidx/percentlayout/widget/PercentFrameTest.java
@@ -21,7 +21,6 @@
import android.os.Build;
import android.view.View;
-import androidx.core.view.ViewCompat;
import androidx.percentlayout.test.R;
import androidx.test.filters.LargeTest;
@@ -179,10 +178,10 @@
if (Build.VERSION.SDK_INT >= 17) {
// Force our child to inherit parent's layout direction
onView(withId(R.id.child_margin_start)).perform(
- LayoutDirectionActions.setLayoutDirection(ViewCompat.LAYOUT_DIRECTION_INHERIT));
+ LayoutDirectionActions.setLayoutDirection(View.LAYOUT_DIRECTION_INHERIT));
// And force the container to RTL mode
onView(withId(R.id.container)).perform(
- LayoutDirectionActions.setLayoutDirection(ViewCompat.LAYOUT_DIRECTION_RTL));
+ LayoutDirectionActions.setLayoutDirection(View.LAYOUT_DIRECTION_RTL));
// Force a full measure + layout pass on the container
mPercentFrameLayout.measure(
@@ -221,10 +220,10 @@
if (Build.VERSION.SDK_INT >= 17) {
// Force our child to inherit parent's layout direction
onView(withId(R.id.child_margin_end)).perform(
- LayoutDirectionActions.setLayoutDirection(ViewCompat.LAYOUT_DIRECTION_INHERIT));
+ LayoutDirectionActions.setLayoutDirection(View.LAYOUT_DIRECTION_INHERIT));
// And force the container to RTL mode
onView(withId(R.id.container)).perform(
- LayoutDirectionActions.setLayoutDirection(ViewCompat.LAYOUT_DIRECTION_RTL));
+ LayoutDirectionActions.setLayoutDirection(View.LAYOUT_DIRECTION_RTL));
// Force a full measure + layout pass on the container
mPercentFrameLayout.measure(
diff --git a/percentlayout/percentlayout/src/androidTest/java/androidx/percentlayout/widget/PercentRelativeRtlTest.java b/percentlayout/percentlayout/src/androidTest/java/androidx/percentlayout/widget/PercentRelativeRtlTest.java
index 68d01a3..6921f94 100644
--- a/percentlayout/percentlayout/src/androidTest/java/androidx/percentlayout/widget/PercentRelativeRtlTest.java
+++ b/percentlayout/percentlayout/src/androidTest/java/androidx/percentlayout/widget/PercentRelativeRtlTest.java
@@ -21,7 +21,6 @@
import android.os.Build;
import android.view.View;
-import androidx.core.view.ViewCompat;
import androidx.percentlayout.test.R;
import androidx.test.filters.LargeTest;
@@ -116,7 +115,7 @@
private void switchToRtl() {
// Force the container to RTL mode
onView(withId(R.id.container)).perform(
- LayoutDirectionActions.setLayoutDirection(ViewCompat.LAYOUT_DIRECTION_RTL));
+ LayoutDirectionActions.setLayoutDirection(View.LAYOUT_DIRECTION_RTL));
// Force a full measure + layout pass on the container
mPercentRelativeLayout.measure(
diff --git a/percentlayout/percentlayout/src/main/java/androidx/percentlayout/widget/PercentLayoutHelper.java b/percentlayout/percentlayout/src/main/java/androidx/percentlayout/widget/PercentLayoutHelper.java
index 4c6d85e..8aec264 100644
--- a/percentlayout/percentlayout/src/main/java/androidx/percentlayout/widget/PercentLayoutHelper.java
+++ b/percentlayout/percentlayout/src/main/java/androidx/percentlayout/widget/PercentLayoutHelper.java
@@ -25,7 +25,6 @@
import androidx.annotation.NonNull;
import androidx.core.view.MarginLayoutParamsCompat;
-import androidx.core.view.ViewCompat;
import androidx.percentlayout.R;
/**
@@ -549,7 +548,7 @@
// Force the resolve pass so that start / end margins are propagated to the
// matching left / right fields
MarginLayoutParamsCompat.resolveLayoutDirection(params,
- ViewCompat.getLayoutDirection(view));
+ view.getLayoutDirection());
}
if (DEBUG) {
Log.d(TAG, "after fillMarginLayoutParams: (" + params.width + ", " + params.height
diff --git a/preference/preference/src/androidTest/java/androidx/preference/tests/SelectableTest.kt b/preference/preference/src/androidTest/java/androidx/preference/tests/SelectableTest.kt
index 83508f4..5421cbe 100644
--- a/preference/preference/src/androidTest/java/androidx/preference/tests/SelectableTest.kt
+++ b/preference/preference/src/androidTest/java/androidx/preference/tests/SelectableTest.kt
@@ -19,7 +19,6 @@
import android.content.Context
import android.graphics.drawable.StateListDrawable
import android.os.Build
-import androidx.core.view.ViewCompat
import androidx.preference.Preference
import androidx.preference.PreferenceCategory
import androidx.preference.PreferenceFragmentCompat
@@ -177,7 +176,7 @@
super.onBindViewHolder(holder)
// If there's no background, no ripple effect will play regardless.
if (holder.itemView.background != null) {
- ViewCompat.setBackground(holder.itemView, TestDrawable())
+ holder.itemView.setBackground(TestDrawable())
}
}
}
diff --git a/preference/preference/src/main/java/androidx/preference/Preference.java b/preference/preference/src/main/java/androidx/preference/Preference.java
index 3039564..79061cb 100644
--- a/preference/preference/src/main/java/androidx/preference/Preference.java
+++ b/preference/preference/src/main/java/androidx/preference/Preference.java
@@ -47,7 +47,6 @@
import androidx.annotation.RestrictTo;
import androidx.appcompat.content.res.AppCompatResources;
import androidx.core.content.res.TypedArrayUtils;
-import androidx.core.view.ViewCompat;
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
import java.util.ArrayList;
@@ -599,7 +598,7 @@
// needed as enabling copying requires the view to be `clickable`, but we only care about
// long clicks, and not normal clicks.
if (copyingEnabled && !selectable) {
- ViewCompat.setBackground(itemView, null);
+ itemView.setBackground(null);
}
}
diff --git a/preference/preference/src/main/java/androidx/preference/PreferenceGroupAdapter.java b/preference/preference/src/main/java/androidx/preference/PreferenceGroupAdapter.java
index 7391982..7cfa2d4 100644
--- a/preference/preference/src/main/java/androidx/preference/PreferenceGroupAdapter.java
+++ b/preference/preference/src/main/java/androidx/preference/PreferenceGroupAdapter.java
@@ -31,7 +31,6 @@
import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.appcompat.content.res.AppCompatResources;
-import androidx.core.view.ViewCompat;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.RecyclerView;
@@ -399,7 +398,7 @@
final View view = inflater.inflate(descriptor.mLayoutResId, parent, false);
if (view.getBackground() == null) {
- ViewCompat.setBackground(view, background);
+ view.setBackground(background);
}
final ViewGroup widgetFrame = view.findViewById(android.R.id.widget_frame);
diff --git a/preference/preference/src/main/java/androidx/preference/PreferenceViewHolder.java b/preference/preference/src/main/java/androidx/preference/PreferenceViewHolder.java
index e3129a8..b5d6b48 100644
--- a/preference/preference/src/main/java/androidx/preference/PreferenceViewHolder.java
+++ b/preference/preference/src/main/java/androidx/preference/PreferenceViewHolder.java
@@ -27,7 +27,6 @@
import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.annotation.VisibleForTesting;
-import androidx.core.view.ViewCompat;
import androidx.recyclerview.widget.RecyclerView;
/**
@@ -144,7 +143,7 @@
*/
void resetState() {
if (itemView.getBackground() != mBackground) {
- ViewCompat.setBackground(itemView, mBackground);
+ itemView.setBackground(mBackground);
}
final TextView titleView = (TextView) findViewById(android.R.id.title);
diff --git a/privacysandbox/sdkruntime/sdkruntime-client/build.gradle b/privacysandbox/sdkruntime/sdkruntime-client/build.gradle
index 52e0f1c..444737c 100644
--- a/privacysandbox/sdkruntime/sdkruntime-client/build.gradle
+++ b/privacysandbox/sdkruntime/sdkruntime-client/build.gradle
@@ -144,7 +144,7 @@
}
namespace "androidx.privacysandbox.sdkruntime.client"
- compileSdkVersion = "android-34-ext8"
+ compileSdkVersion = "android-34-ext10"
}
androidx {
diff --git a/privacysandbox/sdkruntime/sdkruntime-core/build.gradle b/privacysandbox/sdkruntime/sdkruntime-core/build.gradle
index 1cde854..73c5876 100644
--- a/privacysandbox/sdkruntime/sdkruntime-core/build.gradle
+++ b/privacysandbox/sdkruntime/sdkruntime-core/build.gradle
@@ -55,7 +55,7 @@
}
namespace "androidx.privacysandbox.sdkruntime.core"
- compileSdkVersion = "android-34-ext8"
+ compileSdkVersion = "android-34-ext10"
}
androidx {
diff --git a/privacysandbox/sdkruntime/sdkruntime-provider/build.gradle b/privacysandbox/sdkruntime/sdkruntime-provider/build.gradle
index a678791..d83e35f 100644
--- a/privacysandbox/sdkruntime/sdkruntime-provider/build.gradle
+++ b/privacysandbox/sdkruntime/sdkruntime-provider/build.gradle
@@ -44,7 +44,7 @@
android {
namespace "androidx.privacysandbox.sdkruntime.provider"
- compileSdkVersion = "android-34-ext8"
+ compileSdkVersion = "android-34-ext10"
}
androidx {
diff --git a/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/GestureSelectionHelper.java b/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/GestureSelectionHelper.java
index e757d5f..b4355f6 100644
--- a/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/GestureSelectionHelper.java
+++ b/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/GestureSelectionHelper.java
@@ -26,7 +26,6 @@
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
-import androidx.core.view.ViewCompat;
import androidx.recyclerview.selection.SelectionTracker.SelectionPredicate;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.RecyclerView.OnItemTouchListener;
@@ -270,7 +269,7 @@
// the currentItemPos
View lastItem = mRecyclerView.getLayoutManager()
.getChildAt(mRecyclerView.getLayoutManager().getChildCount() - 1);
- int direction = ViewCompat.getLayoutDirection(mRecyclerView);
+ int direction = mRecyclerView.getLayoutDirection();
final boolean pastLastItem = isPastLastItem(lastItem.getTop(),
lastItem.getLeft(),
lastItem.getRight(),
diff --git a/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/BaseRecyclerViewInstrumentationTest.java b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/BaseRecyclerViewInstrumentationTest.java
index 6f2d4fe..fd36e51 100644
--- a/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/BaseRecyclerViewInstrumentationTest.java
+++ b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/BaseRecyclerViewInstrumentationTest.java
@@ -42,7 +42,6 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.core.view.ViewCompat;
import androidx.recyclerview.test.R;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.testutils.ActivityScenarioResetRule;
@@ -128,7 +127,7 @@
mActivityRule.runOnUiThread(new Runnable() {
@Override
public void run() {
- ViewCompat.setHasTransientState(view, value);
+ view.setHasTransientState(value);
}
});
} catch (Throwable throwable) {
@@ -710,7 +709,7 @@
addView(view);
}
measureChildWithMargins(view, 0, 0);
- if (getLayoutDirection() == ViewCompat.LAYOUT_DIRECTION_RTL) {
+ if (getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {
layoutDecorated(view, getWidth() - getDecoratedMeasuredWidth(view), top,
getWidth(), top + getDecoratedMeasuredHeight(view));
} else {
diff --git a/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/FocusSearchNavigationTest.java b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/FocusSearchNavigationTest.java
index bd3d853..ef4b5ad 100644
--- a/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/FocusSearchNavigationTest.java
+++ b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/FocusSearchNavigationTest.java
@@ -77,9 +77,9 @@
@Parameterized.Parameters(name = "orientation:{0},layoutDir:{1}")
public static List<Object[]> params() {
return Arrays.asList(
- new Object[]{VERTICAL, ViewCompat.LAYOUT_DIRECTION_LTR},
- new Object[]{HORIZONTAL, ViewCompat.LAYOUT_DIRECTION_LTR},
- new Object[]{HORIZONTAL, ViewCompat.LAYOUT_DIRECTION_RTL}
+ new Object[]{VERTICAL, View.LAYOUT_DIRECTION_LTR},
+ new Object[]{HORIZONTAL, View.LAYOUT_DIRECTION_LTR},
+ new Object[]{HORIZONTAL, View.LAYOUT_DIRECTION_RTL}
);
}
@@ -118,7 +118,7 @@
waitForIdleSync();
assertThat("Assumption check", mRecyclerView.getLayoutManager().getLayoutDirection(),
is(mLayoutDir));
- assertThat("Assumption check", ViewCompat.getLayoutDirection(mRecyclerView),
+ assertThat("Assumption check", mRecyclerView.getLayoutDirection(),
is(mLayoutDir));
}
diff --git a/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/LinearLayoutManagerTest.java b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/LinearLayoutManagerTest.java
index 8541a57..685e15d 100644
--- a/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/LinearLayoutManagerTest.java
+++ b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/LinearLayoutManagerTest.java
@@ -892,8 +892,8 @@
.findViewHolderForAdapterPosition(childBeingPushOut);
final int originalAccessibility = ViewCompat.getImportantForAccessibility(
itemViewHolder.itemView);
- assertTrue(ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_AUTO == originalAccessibility
- || ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES == originalAccessibility);
+ assertTrue(View.IMPORTANT_FOR_ACCESSIBILITY_AUTO == originalAccessibility
+ || View.IMPORTANT_FOR_ACCESSIBILITY_YES == originalAccessibility);
itemAnimator.expect(ItemAnimatorTestDouble.MOVE_START, 1);
mActivityRule.runOnUiThread(new Runnable() {
@@ -908,8 +908,8 @@
// RV Changes accessiblity after onMoveStart, so wait one more cycle.
waitOneCycle();
assertTrue(itemAnimator.getMovesAnimations().contains(itemViewHolder));
- assertEquals(ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS,
- ViewCompat.getImportantForAccessibility(itemViewHolder.itemView));
+ assertEquals(View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS,
+ itemViewHolder.itemView.getImportantForAccessibility());
// notify Change again to run predictive animation.
mLayoutManager.expectLayouts(2);
@@ -935,8 +935,8 @@
// the important for accessibility should be reset to YES/AUTO:
final int newAccessibility = ViewCompat.getImportantForAccessibility(
itemViewHolder.itemView);
- assertTrue(ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_AUTO == newAccessibility
- || ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES == newAccessibility);
+ assertTrue(View.IMPORTANT_FOR_ACCESSIBILITY_AUTO == newAccessibility
+ || View.IMPORTANT_FOR_ACCESSIBILITY_YES == newAccessibility);
}
@Test
diff --git a/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/LinearLayoutManagerWrapContentTest.java b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/LinearLayoutManagerWrapContentTest.java
index 07e10e5..dea5a18 100644
--- a/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/LinearLayoutManagerWrapContentTest.java
+++ b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/LinearLayoutManagerWrapContentTest.java
@@ -22,8 +22,8 @@
import android.graphics.Rect;
import android.os.Build;
import android.view.Gravity;
+import android.view.View;
-import androidx.core.view.ViewCompat;
import androidx.test.filters.LargeTest;
import androidx.test.filters.SdkSuppress;
@@ -167,7 +167,7 @@
@Override
protected int getHorizontalGravity(RecyclerView.LayoutManager layoutManager) {
- boolean rtl = layoutManager.getLayoutDirection() == ViewCompat.LAYOUT_DIRECTION_RTL;
+ boolean rtl = layoutManager.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
if (mConfig.mOrientation == VERTICAL) {
if (rtl) {
return Gravity.RIGHT;
diff --git a/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/RecyclerViewAccessibilityLifecycleTest.java b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/RecyclerViewAccessibilityLifecycleTest.java
index 3d5e3c6..2ee833e 100644
--- a/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/RecyclerViewAccessibilityLifecycleTest.java
+++ b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/RecyclerViewAccessibilityLifecycleTest.java
@@ -88,8 +88,7 @@
public TestViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
int viewType) {
TestViewHolder vh = super.onCreateViewHolder(parent, viewType);
- ViewCompat.setImportantForAccessibility(vh.itemView,
- ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES);
+ vh.itemView.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
return vh;
}
};
@@ -104,10 +103,10 @@
lm.waitForLayout(2);
recyclerView.waitUntilAnimations();
assertThat(invocations, is(Arrays.asList(
- ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS,
- ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS,
- ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES,
- ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES)));
+ View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS,
+ View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS,
+ View.IMPORTANT_FOR_ACCESSIBILITY_YES,
+ View.IMPORTANT_FOR_ACCESSIBILITY_YES)));
assertThat(calledA11DuringLayout.get(), is(false));
}
@@ -437,7 +436,7 @@
@Override
public void run() {
View itemView = mRecyclerView.getChildAt(0);
- assertTrue(ViewCompat.performAccessibilityAction(itemView, 42, null));
+ assertTrue(itemView.performAccessibilityAction(42, null));
}
});
}
@@ -454,7 +453,7 @@
@Override
public void run() {
View itemView = mRecyclerView.getChildAt(0);
- assertTrue(ViewCompat.performAccessibilityAction(itemView, 42, null));
+ assertTrue(itemView.performAccessibilityAction(42, null));
}
},
new TextViewCreator() {
diff --git a/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/RecyclerViewAnimationsTest.java b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/RecyclerViewAnimationsTest.java
index 3ab549f..cde0f62 100644
--- a/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/RecyclerViewAnimationsTest.java
+++ b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/RecyclerViewAnimationsTest.java
@@ -31,7 +31,6 @@
import android.view.ViewGroup;
import androidx.annotation.NonNull;
-import androidx.core.view.ViewCompat;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
import androidx.testutils.AnimationDurationScaleRule;
@@ -690,8 +689,7 @@
public boolean canProceed() {
View slideInView = mRecyclerView.getChildAt(2);
View slideOutView = mRecyclerView.getChildAt(3);
- return ViewCompat.hasTransientState(slideInView)
- && ViewCompat.hasTransientState(slideOutView);
+ return slideInView.hasTransientState() && slideOutView.hasTransientState();
}
});
@@ -788,8 +786,7 @@
@Override
public void onBindViewHolder(@NonNull TestViewHolder holder, int position) {
super.onBindViewHolder(holder, position);
- ViewCompat.setImportantForAccessibility(
- holder.itemView, boundImportantForAccessibility);
+ holder.itemView.setImportantForAccessibility(boundImportantForAccessibility);
}
};
@@ -806,7 +803,7 @@
targetChild[0] = mRecyclerView.getChildAt(0);
assertEquals(
expectedImportantForAccessibility,
- ViewCompat.getImportantForAccessibility(targetChild[0]));
+ targetChild[0].getImportantForAccessibility());
}
});
@@ -824,8 +821,8 @@
// The view is still a child of mRecyclerView, and is invisible for accessibility.
assertTrue(targetChild[0].getParent() == mRecyclerView);
assertEquals(
- ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS,
- ViewCompat.getImportantForAccessibility(targetChild[0]));
+ View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS,
+ targetChild[0].getImportantForAccessibility());
}
});
@@ -839,7 +836,7 @@
assertTrue(targetChild[0].getParent() == null);
assertEquals(
expectedImportantForAccessibility,
- ViewCompat.getImportantForAccessibility(targetChild[0]));
+ targetChild[0].getImportantForAccessibility());
}
});
@@ -856,7 +853,7 @@
"the item must be reused", targetChild[0] == mRecyclerView.getChildAt(0));
assertEquals(
expectedImportantForAccessibility,
- ViewCompat.getImportantForAccessibility(targetChild[0]));
+ targetChild[0].getImportantForAccessibility());
}
});
}
@@ -864,29 +861,29 @@
@Test
public void importantForAccessibilityWhileDetelingAuto() throws Throwable {
runTestImportantForAccessibilityWhileDeteling(
- ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_AUTO,
- ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES);
+ View.IMPORTANT_FOR_ACCESSIBILITY_AUTO,
+ View.IMPORTANT_FOR_ACCESSIBILITY_YES);
}
@Test
public void importantForAccessibilityWhileDetelingNo() throws Throwable {
runTestImportantForAccessibilityWhileDeteling(
- ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO,
- ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO);
+ View.IMPORTANT_FOR_ACCESSIBILITY_NO,
+ View.IMPORTANT_FOR_ACCESSIBILITY_NO);
}
@Test
public void importantForAccessibilityWhileDetelingNoHideDescandants() throws Throwable {
runTestImportantForAccessibilityWhileDeteling(
- ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS,
- ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
+ View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS,
+ View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
}
@Test
public void importantForAccessibilityWhileDetelingYes() throws Throwable {
runTestImportantForAccessibilityWhileDeteling(
- ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES,
- ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES);
+ View.IMPORTANT_FOR_ACCESSIBILITY_YES,
+ View.IMPORTANT_FOR_ACCESSIBILITY_YES);
}
@Test
@@ -1583,7 +1580,7 @@
@Override
public void onViewDetachedFromWindow(TestViewHolder holder) {
if ((addedView[0] == holder.itemView || addedView[1] == holder.itemView)
- && ViewCompat.hasTransientState(holder.itemView)) {
+ && holder.itemView.hasTransientState()) {
holder.itemView.animate().cancel();
}
super.onViewDetachedFromWindow(holder);
@@ -1607,11 +1604,11 @@
public void run() {
if (mRecyclerView.getChildCount() == 3) {
View view = mRecyclerView.getChildAt(0);
- if (ViewCompat.hasTransientState(view)) {
+ if (view.hasTransientState()) {
addedView[0] = view;
}
view = mRecyclerView.getChildAt(1);
- if (ViewCompat.hasTransientState(view)) {
+ if (view.hasTransientState()) {
addedView[1] = view;
}
}
diff --git a/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/RecyclerViewLayoutTest.java b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/RecyclerViewLayoutTest.java
index 741bb69..07d8564 100644
--- a/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/RecyclerViewLayoutTest.java
+++ b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/RecyclerViewLayoutTest.java
@@ -2377,7 +2377,7 @@
mActivityRule.runOnUiThread(new Runnable() {
@Override
public void run() {
- ViewCompat.setHasTransientState(vh.itemView, true);
+ vh.itemView.setHasTransientState(true);
}
});
tlm.expectLayouts(1);
@@ -4908,14 +4908,14 @@
@Test
public void focusBigViewOnLeftRTL() throws Throwable {
focusTooBigViewTest(Gravity.LEFT, true);
- assertEquals("Assumption check", ViewCompat.LAYOUT_DIRECTION_RTL,
+ assertEquals("Assumption check", View.LAYOUT_DIRECTION_RTL,
mRecyclerView.getLayoutManager().getLayoutDirection());
}
@Test
public void focusBigViewOnRightRTL() throws Throwable {
focusTooBigViewTest(Gravity.RIGHT, true);
- assertEquals("Assumption check", ViewCompat.LAYOUT_DIRECTION_RTL,
+ assertEquals("Assumption check", View.LAYOUT_DIRECTION_RTL,
mRecyclerView.getLayoutManager().getLayoutDirection());
}
@@ -4926,7 +4926,7 @@
public void focusTooBigViewTest(final int gravity, final boolean rtl) throws Throwable {
RecyclerView rv = new RecyclerView(getActivity());
if (rtl) {
- ViewCompat.setLayoutDirection(rv, ViewCompat.LAYOUT_DIRECTION_RTL);
+ ViewCompat.setLayoutDirection(rv, View.LAYOUT_DIRECTION_RTL);
}
final AtomicInteger vScrollDist = new AtomicInteger(0);
final AtomicInteger hScrollDist = new AtomicInteger(0);
@@ -4936,7 +4936,7 @@
@Override
public int getLayoutDirection() {
- return rtl ? ViewCompat.LAYOUT_DIRECTION_RTL : ViewCompat.LAYOUT_DIRECTION_LTR;
+ return rtl ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR;
}
@Override
@@ -4957,7 +4957,7 @@
left = gravity == Gravity.LEFT ? getWidth() - view.getMeasuredWidth() - 80
: 90;
top = 0;
- if (ViewCompat.LAYOUT_DIRECTION_RTL == getLayoutDirection()) {
+ if (View.LAYOUT_DIRECTION_RTL == getLayoutDirection()) {
hDesiredDist.set((left + view.getMeasuredWidth()) - getWidth());
} else {
hDesiredDist.set(left);
diff --git a/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/RecyclerViewNestedScrollingA11yScrollTest.java b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/RecyclerViewNestedScrollingA11yScrollTest.java
index 25ece5f..a6bf082 100644
--- a/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/RecyclerViewNestedScrollingA11yScrollTest.java
+++ b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/RecyclerViewNestedScrollingA11yScrollTest.java
@@ -188,7 +188,7 @@
}
});
- ViewCompat.performAccessibilityAction(mRecyclerView, action, null);
+ mRecyclerView.performAccessibilityAction(action, null);
}
});
assertThat(countDownLatch.await(2, TimeUnit.SECONDS), is(true));
diff --git a/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/WrappedRecyclerView.java b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/WrappedRecyclerView.java
index e610193..ebb2957 100644
--- a/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/WrappedRecyclerView.java
+++ b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/WrappedRecyclerView.java
@@ -18,8 +18,8 @@
import android.content.Context;
import android.util.AttributeSet;
+import android.view.View;
-import androidx.core.view.ViewCompat;
import androidx.test.platform.app.InstrumentationRegistry;
import org.hamcrest.CoreMatchers;
@@ -104,8 +104,8 @@
return super.getLayoutDirection();
}
//noinspection WrongConstant
- return Boolean.TRUE.equals(mFakeRTL) ? ViewCompat.LAYOUT_DIRECTION_RTL
- : ViewCompat.LAYOUT_DIRECTION_LTR;
+ return Boolean.TRUE.equals(mFakeRTL) ? View.LAYOUT_DIRECTION_RTL
+ : View.LAYOUT_DIRECTION_LTR;
}
@Override
diff --git a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/FastScroller.java b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/FastScroller.java
index 030e705..96438a5 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/FastScroller.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/FastScroller.java
@@ -24,12 +24,12 @@
import android.graphics.drawable.Drawable;
import android.graphics.drawable.StateListDrawable;
import android.view.MotionEvent;
+import android.view.View;
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
-import androidx.core.view.ViewCompat;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -212,7 +212,7 @@
}
private boolean isLayoutRTL() {
- return ViewCompat.getLayoutDirection(mRecyclerView) == ViewCompat.LAYOUT_DIRECTION_RTL;
+ return mRecyclerView.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
}
public boolean isDragging() {
diff --git a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/ItemTouchHelper.java b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/ItemTouchHelper.java
index 2865dad..0bfd394 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/ItemTouchHelper.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/ItemTouchHelper.java
@@ -1205,7 +1205,7 @@
final int originalMovementFlags = mCallback.getMovementFlags(mRecyclerView, viewHolder);
final int absoluteMovementFlags = mCallback.convertToAbsoluteDirection(
originalMovementFlags,
- ViewCompat.getLayoutDirection(mRecyclerView));
+ mRecyclerView.getLayoutDirection());
final int flags = (absoluteMovementFlags
& ACTION_MODE_SWIPE_MASK) >> (ACTION_STATE_SWIPE * DIRECTION_FLAG_COUNT);
if (flags == 0) {
@@ -1220,7 +1220,7 @@
if ((originalFlags & swipeDir) == 0) {
// convert to relative
return Callback.convertToRelativeDirection(swipeDir,
- ViewCompat.getLayoutDirection(mRecyclerView));
+ mRecyclerView.getLayoutDirection());
}
return swipeDir;
}
@@ -1236,7 +1236,7 @@
if ((originalFlags & swipeDir) == 0) {
// convert to relative
return Callback.convertToRelativeDirection(swipeDir,
- ViewCompat.getLayoutDirection(mRecyclerView));
+ mRecyclerView.getLayoutDirection());
}
return swipeDir;
}
@@ -1495,7 +1495,7 @@
return flags; // does not have any abs flags, good.
}
flags &= ~masked; //remove left / right.
- if (layoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR) {
+ if (layoutDirection == View.LAYOUT_DIRECTION_LTR) {
// no change. just OR with 2 bits shifted mask and return
flags |= masked << 2; // START is 2 bits after LEFT, END is 2 bits after RIGHT.
return flags;
@@ -1586,7 +1586,7 @@
return flags; // does not have any relative flags, good.
}
flags &= ~masked; //remove start / end
- if (layoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR) {
+ if (layoutDirection == View.LAYOUT_DIRECTION_LTR) {
// no change. just OR with 2 bits shifted mask and return
flags |= masked >> 2; // START is 2 bits after LEFT, END is 2 bits after RIGHT.
return flags;
@@ -1602,7 +1602,7 @@
final int getAbsoluteMovementFlags(RecyclerView recyclerView,
ViewHolder viewHolder) {
final int flags = getMovementFlags(recyclerView, viewHolder);
- return convertToAbsoluteDirection(flags, ViewCompat.getLayoutDirection(recyclerView));
+ return convertToAbsoluteDirection(flags, recyclerView.getLayoutDirection());
}
boolean hasDragFlag(RecyclerView recyclerView, ViewHolder viewHolder) {
diff --git a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/LinearLayoutManager.java b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/LinearLayoutManager.java
index 5f96d22..4fc3df2 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/LinearLayoutManager.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/LinearLayoutManager.java
@@ -1121,7 +1121,7 @@
}
protected boolean isLayoutRTL() {
- return getLayoutDirection() == ViewCompat.LAYOUT_DIRECTION_RTL;
+ return getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
}
void ensureLayoutState() {
diff --git a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java
index a4ea5a5..ea813c32 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java
@@ -799,10 +799,9 @@
initChildrenHelper();
initAutofill();
// If not explicitly specified this view is important for accessibility.
- if (ViewCompat.getImportantForAccessibility(this)
- == ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
- ViewCompat.setImportantForAccessibility(this,
- ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES);
+ if (this.getImportantForAccessibility()
+ == View.IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
+ setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
}
mAccessibilityManager = (AccessibilityManager) getContext()
.getSystemService(Context.ACCESSIBILITY_SERVICE);
@@ -3085,7 +3084,7 @@
}
if (invalidate || overscrollX != 0 || overscrollY != 0) {
- ViewCompat.postInvalidateOnAnimation(this);
+ postInvalidateOnAnimation();
}
}
@@ -3108,7 +3107,7 @@
needsInvalidate |= mBottomGlow.isFinished();
}
if (needsInvalidate) {
- ViewCompat.postInvalidateOnAnimation(this);
+ postInvalidateOnAnimation();
}
}
@@ -3131,7 +3130,7 @@
needsInvalidate |= mBottomGlow.isFinished();
}
if (needsInvalidate) {
- ViewCompat.postInvalidateOnAnimation(this);
+ postInvalidateOnAnimation();
}
}
@@ -3161,7 +3160,7 @@
}
if (velocityX != 0 || velocityY != 0) {
- ViewCompat.postInvalidateOnAnimation(this);
+ postInvalidateOnAnimation();
}
}
@@ -3301,7 +3300,7 @@
needsFocusFailureLayout = found == null;
}
if (!needsFocusFailureLayout && mLayout.canScrollHorizontally()) {
- boolean rtl = mLayout.getLayoutDirection() == ViewCompat.LAYOUT_DIRECTION_RTL;
+ boolean rtl = mLayout.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
final int absDir = (direction == View.FOCUS_FORWARD) ^ rtl
? View.FOCUS_RIGHT : View.FOCUS_LEFT;
final View found = ff.findNextFocus(this, focused, absDir);
@@ -3378,7 +3377,7 @@
mTempRect2.set(0, 0, next.getWidth(), next.getHeight());
offsetDescendantRectToMyCoords(focused, mTempRect);
offsetDescendantRectToMyCoords(next, mTempRect2);
- final int rtl = mLayout.getLayoutDirection() == ViewCompat.LAYOUT_DIRECTION_RTL ? -1 : 1;
+ final int rtl = mLayout.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL ? -1 : 1;
int rightness = 0;
if ((mTempRect.left < mTempRect2.left
|| mTempRect.right <= mTempRect2.left)
@@ -5087,7 +5086,7 @@
}
if (needsInvalidate) {
- ViewCompat.postInvalidateOnAnimation(this);
+ postInvalidateOnAnimation();
}
}
@@ -7027,10 +7026,9 @@
private void attachAccessibilityDelegateOnBind(ViewHolder holder) {
if (isAccessibilityEnabled()) {
final View itemView = holder.itemView;
- if (ViewCompat.getImportantForAccessibility(itemView)
- == ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
- ViewCompat.setImportantForAccessibility(itemView,
- ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES);
+ if (itemView.getImportantForAccessibility()
+ == View.IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
+ itemView.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
}
if (mAccessibilityDelegate == null) {
return;
@@ -7931,16 +7929,16 @@
holder.mBindingAdapter = this;
if (sDebugAssertionsEnabled) {
if (holder.itemView.getParent() == null
- && (ViewCompat.isAttachedToWindow(holder.itemView)
+ && (holder.itemView.isAttachedToWindow()
!= holder.isTmpDetached())) {
throw new IllegalStateException("Temp-detached state out of sync with reality. "
+ "holder.isTmpDetached(): " + holder.isTmpDetached()
+ ", attached to window: "
- + ViewCompat.isAttachedToWindow(holder.itemView)
+ + holder.itemView.isAttachedToWindow()
+ ", holder: " + holder);
}
if (holder.itemView.getParent() == null
- && ViewCompat.isAttachedToWindow(holder.itemView)) {
+ && holder.itemView.isAttachedToWindow()) {
throw new IllegalStateException(
"Attempting to bind attached holder with no parent"
+ " (AKA temp detached): " + holder);
@@ -9412,7 +9410,7 @@
* is not RTL.
*/
public int getLayoutDirection() {
- return ViewCompat.getLayoutDirection(mRecyclerView);
+ return mRecyclerView.getLayoutDirection();
}
/**
@@ -10783,7 +10781,7 @@
// of a large rect into view. If we decide to bring in end because start is already
// visible, limit the scroll such that start won't go out of bounds.
final int dx;
- if (getLayoutDirection() == ViewCompat.LAYOUT_DIRECTION_RTL) {
+ if (getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {
dx = offScreenRight != 0 ? offScreenRight
: Math.max(offScreenLeft, childRight - parentRight);
} else {
@@ -12059,7 +12057,7 @@
// Saves isImportantForAccessibility value for the view item while it's in hidden state and
// marked as unimportant for accessibility.
private int mWasImportantForAccessibilityBeforeHidden =
- ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_AUTO;
+ View.IMPORTANT_FOR_ACCESSIBILITY_AUTO;
// set if we defer the accessibility state change of the view holder
@VisibleForTesting
int mPendingAccessibilityState = PENDING_ACCESSIBILITY_STATE_NOT_SET;
@@ -12427,7 +12425,7 @@
mShadowedHolder = null;
mShadowingHolder = null;
clearPayload();
- mWasImportantForAccessibilityBeforeHidden = ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_AUTO;
+ mWasImportantForAccessibilityBeforeHidden = View.IMPORTANT_FOR_ACCESSIBILITY_AUTO;
mPendingAccessibilityState = PENDING_ACCESSIBILITY_STATE_NOT_SET;
clearNestedRecyclerViewIfNotNested(this);
}
@@ -12441,10 +12439,10 @@
mWasImportantForAccessibilityBeforeHidden = mPendingAccessibilityState;
} else {
mWasImportantForAccessibilityBeforeHidden =
- ViewCompat.getImportantForAccessibility(itemView);
+ itemView.getImportantForAccessibility();
}
parent.setChildImportantForAccessibilityInternal(this,
- ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
+ View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
}
/**
@@ -12453,7 +12451,7 @@
void onLeftHiddenState(RecyclerView parent) {
parent.setChildImportantForAccessibilityInternal(this,
mWasImportantForAccessibilityBeforeHidden);
- mWasImportantForAccessibilityBeforeHidden = ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_AUTO;
+ mWasImportantForAccessibilityBeforeHidden = View.IMPORTANT_FOR_ACCESSIBILITY_AUTO;
}
@Override
@@ -12554,7 +12552,7 @@
mPendingAccessibilityImportanceChange.add(viewHolder);
return false;
}
- ViewCompat.setImportantForAccessibility(viewHolder.itemView, importantForAccessibility);
+ viewHolder.itemView.setImportantForAccessibility(importantForAccessibility);
return true;
}
@@ -12567,7 +12565,7 @@
int state = viewHolder.mPendingAccessibilityState;
if (state != ViewHolder.PENDING_ACCESSIBILITY_STATE_NOT_SET) {
//noinspection WrongConstant
- ViewCompat.setImportantForAccessibility(viewHolder.itemView, state);
+ viewHolder.itemView.setImportantForAccessibility(state);
viewHolder.mPendingAccessibilityState =
ViewHolder.PENDING_ACCESSIBILITY_STATE_NOT_SET;
}
diff --git a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/StaggeredGridLayoutManager.java b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/StaggeredGridLayoutManager.java
index 45911a1..ec4a4d7 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/StaggeredGridLayoutManager.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/StaggeredGridLayoutManager.java
@@ -33,7 +33,6 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
-import androidx.core.view.ViewCompat;
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
import java.util.ArrayList;
@@ -565,7 +564,7 @@
}
boolean isLayoutRTL() {
- return getLayoutDirection() == ViewCompat.LAYOUT_DIRECTION_RTL;
+ return getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
}
/**
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/processor/GeneratedCustomConverterTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/processor/GeneratedCustomConverterTest.kt
new file mode 100644
index 0000000..fc28dad
--- /dev/null
+++ b/room/room-compiler/src/test/kotlin/androidx/room/processor/GeneratedCustomConverterTest.kt
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2023 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.room.processor
+
+import androidx.room.RoomKspProcessor
+import androidx.room.RoomProcessor
+import androidx.room.compiler.processing.XElement
+import androidx.room.compiler.processing.XFiler
+import androidx.room.compiler.processing.XProcessingEnv
+import androidx.room.compiler.processing.XProcessingStep
+import androidx.room.compiler.processing.addOriginatingElement
+import androidx.room.compiler.processing.javac.JavacBasicAnnotationProcessor
+import androidx.room.compiler.processing.ksp.KspBasicAnnotationProcessor
+import androidx.room.compiler.processing.util.Source
+import androidx.room.compiler.processing.util.runProcessorTest
+import com.google.devtools.ksp.processing.SymbolProcessorEnvironment
+import com.google.devtools.ksp.processing.SymbolProcessorProvider
+import com.squareup.javapoet.ClassName
+import com.squareup.javapoet.JavaFile
+import com.squareup.javapoet.MethodSpec
+import com.squareup.javapoet.TypeSpec
+import javax.lang.model.SourceVersion
+import javax.lang.model.element.Modifier
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class GeneratedCustomConverterTest {
+
+ @Test
+ fun generatedConverter() {
+ val src = Source.kotlin(
+ "Sources.kt",
+ """
+ import androidx.room.*
+
+ @Database(entities = [MyEntity::class], version = 1, exportSchema = false)
+ @TypeConverters(Generated_CustomConverters::class)
+ abstract class MyDatabase : RoomDatabase() {
+ abstract fun getMyDao(): MyDao
+ }
+
+ @Dao
+ interface MyDao {
+ @Query("SELECT * FROM MyEntity")
+ fun getMyEntity(): MyEntity
+ }
+
+ @Entity
+ @GenConverter
+ data class MyEntity(
+ @PrimaryKey val id: Long,
+ val data: Foo
+ )
+
+ class Foo
+
+ annotation class GenConverter
+ """.trimIndent()
+ )
+ runProcessorTest(
+ sources = listOf(src),
+ javacProcessors =
+ listOf(RoomProcessor(), JavacCustomConverter()),
+ symbolProcessorProviders =
+ listOf(RoomKspProcessor.Provider(), KspCustomConverter.Provider())
+ ) {
+ it.hasNoWarnings()
+ }
+ }
+
+ class CustomConverterGenerator : XProcessingStep {
+ override fun annotations() = setOf("GenConverter")
+ override fun process(
+ env: XProcessingEnv,
+ elementsByAnnotation: Map<String, Set<XElement>>,
+ isLastRound: Boolean
+ ): Set<XElement> {
+ val elements = elementsByAnnotation.getOrDefault("GenConverter", emptySet())
+ val element = elements.singleOrNull() ?: return emptySet()
+ val typeSpec = TypeSpec.classBuilder("Generated_CustomConverters")
+ .addOriginatingElement(element)
+ .addModifiers(Modifier.PUBLIC, Modifier.FINAL)
+ .addMethod(MethodSpec.methodBuilder("fooToString")
+ .addAnnotation(ClassName.get("androidx.room", "TypeConverter"))
+ .addModifiers(Modifier.PUBLIC)
+ .returns(ClassName.get("java.lang", "String"))
+ .addParameter(ClassName.get("", "Foo"), "f")
+ .addStatement("return \$S", "")
+ .build()
+ )
+ .addMethod(MethodSpec.methodBuilder("stringToFoo")
+ .addAnnotation(ClassName.get("androidx.room", "TypeConverter"))
+ .addModifiers(Modifier.PUBLIC)
+ .returns(ClassName.get("", "Foo"))
+ .addParameter(ClassName.get("java.lang", "String"), "s")
+ .addStatement("return new Foo()")
+ .build()
+ )
+ .build()
+ val javaFile = JavaFile.builder("", typeSpec).build()
+ env.filer.write(javaFile, XFiler.Mode.Isolating)
+ return emptySet()
+ }
+ }
+
+ class JavacCustomConverter : JavacBasicAnnotationProcessor() {
+ override fun processingSteps() = listOf(CustomConverterGenerator())
+ override fun getSupportedSourceVersion() = SourceVersion.latest()
+ }
+
+ class KspCustomConverter(env: SymbolProcessorEnvironment) : KspBasicAnnotationProcessor(env) {
+ override fun processingSteps() = listOf(CustomConverterGenerator())
+ class Provider : SymbolProcessorProvider {
+ override fun create(environment: SymbolProcessorEnvironment) =
+ KspCustomConverter(environment)
+ }
+ }
+}
diff --git a/samples/AndroidXDemos/src/main/java/com/example/androidx/graphics/PaletteActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/graphics/PaletteActivity.java
index 3eed2a3..6e584bb 100644
--- a/samples/AndroidXDemos/src/main/java/com/example/androidx/graphics/PaletteActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/graphics/PaletteActivity.java
@@ -33,7 +33,6 @@
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
-import androidx.core.view.ViewCompat;
import androidx.cursoradapter.widget.ResourceCursorAdapter;
import androidx.fragment.app.ListFragment;
import androidx.loader.app.LoaderManager;
@@ -195,12 +194,12 @@
ImageView imageView = (ImageView) view.findViewById(R.id.image);
imageView.setImageDrawable(null);
- ViewCompat.setBackground(view.findViewById(R.id.text_vibrant), null);
- ViewCompat.setBackground(view.findViewById(R.id.text_muted), null);
- ViewCompat.setBackground(view.findViewById(R.id.text_light_vibrant), null);
- ViewCompat.setBackground(view.findViewById(R.id.text_light_muted), null);
- ViewCompat.setBackground(view.findViewById(R.id.text_dark_vibrant), null);
- ViewCompat.setBackground(view.findViewById(R.id.text_dark_muted), null);
+ view.findViewById(R.id.text_vibrant).setBackground(null);
+ view.findViewById(R.id.text_muted).setBackground(null);
+ view.findViewById(R.id.text_light_vibrant).setBackground(null);
+ view.findViewById(R.id.text_light_muted).setBackground(null);
+ view.findViewById(R.id.text_dark_vibrant).setBackground(null);
+ view.findViewById(R.id.text_dark_muted).setBackground(null);
final long id = cursor.getLong(
cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns._ID));
diff --git a/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/GridLayoutManagerActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/GridLayoutManagerActivity.java
index f5a94d7..57d01f5 100644
--- a/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/GridLayoutManagerActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/GridLayoutManagerActivity.java
@@ -18,7 +18,6 @@
import android.view.View;
import android.view.ViewGroup;
-import androidx.core.view.ViewCompat;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
@@ -79,14 +78,13 @@
new ConfigToggle(this, R.string.checkbox_layout_dir) {
@Override
public boolean isChecked() {
- return ViewCompat.getLayoutDirection(mRecyclerView) ==
- ViewCompat.LAYOUT_DIRECTION_RTL;
+ return mRecyclerView.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
}
@Override
public void onChange(boolean newValue) {
- ViewCompat.setLayoutDirection(mRecyclerView, newValue ?
- ViewCompat.LAYOUT_DIRECTION_RTL : ViewCompat.LAYOUT_DIRECTION_LTR);
+ mRecyclerView.setLayoutDirection(newValue
+ ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR);
}
},
new ConfigToggle(this, R.string.checkbox_stack_from_end) {
diff --git a/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/LinearLayoutManagerActivity.java b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/LinearLayoutManagerActivity.java
index 5bae336..07ec953 100644
--- a/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/LinearLayoutManagerActivity.java
+++ b/samples/AndroidXDemos/src/main/java/com/example/androidx/widget/LinearLayoutManagerActivity.java
@@ -16,7 +16,8 @@
package com.example.androidx.widget;
-import androidx.core.view.ViewCompat;
+import android.view.View;
+
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.LinearSnapHelper;
@@ -78,14 +79,13 @@
new ConfigToggle(this, R.string.checkbox_layout_dir) {
@Override
public boolean isChecked() {
- return ViewCompat.getLayoutDirection(mRecyclerView) ==
- ViewCompat.LAYOUT_DIRECTION_RTL;
+ return mRecyclerView.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
}
@Override
public void onChange(boolean newValue) {
- ViewCompat.setLayoutDirection(mRecyclerView, newValue ?
- ViewCompat.LAYOUT_DIRECTION_RTL : ViewCompat.LAYOUT_DIRECTION_LTR);
+ mRecyclerView.setLayoutDirection(newValue
+ ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR);
}
},
new ConfigToggle(this, R.string.checkbox_stack_from_end) {
diff --git a/samples/Support4Demos/src/main/java/com/example/android/supportv4/view/CheckableFrameLayout.java b/samples/Support4Demos/src/main/java/com/example/android/supportv4/view/CheckableFrameLayout.java
index 9cdc294..d9f1871 100644
--- a/samples/Support4Demos/src/main/java/com/example/android/supportv4/view/CheckableFrameLayout.java
+++ b/samples/Support4Demos/src/main/java/com/example/android/supportv4/view/CheckableFrameLayout.java
@@ -22,8 +22,6 @@
import android.widget.Checkable;
import android.widget.FrameLayout;
-import androidx.core.view.ViewCompat;
-
public class CheckableFrameLayout extends FrameLayout implements Checkable {
private boolean mChecked;
@@ -38,7 +36,7 @@
@Override
public void setChecked(boolean checked) {
mChecked = checked;
- ViewCompat.setBackground(this, checked ? new ColorDrawable(0xff0000a0) : null);
+ setBackground(checked ? new ColorDrawable(0xff0000a0) : null);
}
@Override
diff --git a/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/ChangeClipBoundsUsage.java b/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/ChangeClipBoundsUsage.java
index 2ffab79..9d2ec514 100644
--- a/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/ChangeClipBoundsUsage.java
+++ b/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/ChangeClipBoundsUsage.java
@@ -23,7 +23,6 @@
import android.view.ViewGroup;
import android.widget.ImageView;
-import androidx.core.view.ViewCompat;
import androidx.transition.ChangeClipBounds;
import androidx.transition.TransitionManager;
@@ -60,10 +59,10 @@
void toggle() {
TransitionManager.beginDelayedTransition(mRoot, mChangeClipBounds);
- if (BOUNDS.equals(ViewCompat.getClipBounds(mPhoto))) {
- ViewCompat.setClipBounds(mPhoto, null);
+ if (BOUNDS.equals(mPhoto.getClipBounds())) {
+ mPhoto.setClipBounds(null);
} else {
- ViewCompat.setClipBounds(mPhoto, BOUNDS);
+ mPhoto.setClipBounds(BOUNDS);
}
}
diff --git a/slice/slice-builders-ktx/src/androidTest/java/androidx/slice/builders/SliceBuildersKtxTest.kt b/slice/slice-builders-ktx/src/androidTest/java/androidx/slice/builders/SliceBuildersKtxTest.kt
index 71dae27..0612976 100644
--- a/slice/slice-builders-ktx/src/androidTest/java/androidx/slice/builders/SliceBuildersKtxTest.kt
+++ b/slice/slice-builders-ktx/src/androidTest/java/androidx/slice/builders/SliceBuildersKtxTest.kt
@@ -21,9 +21,6 @@
import android.content.Intent
import android.net.Uri
import androidx.core.graphics.drawable.IconCompat
-import androidx.slice.SliceProvider
-import androidx.slice.SliceSpecs
-import androidx.slice.builders.ListBuilder.ICON_IMAGE
import androidx.slice.builders.ktx.test.R
import androidx.test.core.app.ApplicationProvider
import androidx.test.filters.MediumTest
@@ -37,8 +34,8 @@
private val context = ApplicationProvider.getApplicationContext() as android.content.Context
init {
- SliceProvider.setSpecs(setOf(SliceSpecs.LIST))
- SliceProvider.setClock { 0 }
+ androidx.slice.SliceProvider.setSpecs(setOf(androidx.slice.SliceSpecs.LIST))
+ androidx.slice.SliceProvider.setClock { 0 }
}
private fun pendingIntentToTestActivity() =
@@ -209,7 +206,7 @@
addAction(sliceAction2)
gridRow {
icons.forEach {
- cell { addImage(it, ICON_IMAGE) }
+ cell { addImage(it, androidx.slice.builders.ListBuilder.ICON_IMAGE) }
}
}
}
@@ -227,10 +224,12 @@
addGridRow(
GridRowBuilder().apply {
icons.forEach { icon ->
- GridRowBuilder.CellBuilder().addImage(icon, ICON_IMAGE)
+ GridRowBuilder.CellBuilder().addImage(
+ icon, androidx.slice.builders.ListBuilder.ICON_IMAGE
+ )
addCell(
GridRowBuilder.CellBuilder().apply {
- addImage(icon, ICON_IMAGE)
+ addImage(icon, androidx.slice.builders.ListBuilder.ICON_IMAGE)
}
)
}
diff --git a/slice/slice-builders-ktx/src/main/java/androidx/slice/builders/ListBuilder.kt b/slice/slice-builders-ktx/src/main/java/androidx/slice/builders/ListBuilder.kt
index a782bc4..9c40e5d 100644
--- a/slice/slice-builders-ktx/src/main/java/androidx/slice/builders/ListBuilder.kt
+++ b/slice/slice-builders-ktx/src/main/java/androidx/slice/builders/ListBuilder.kt
@@ -21,7 +21,6 @@
import androidx.annotation.RestrictTo
import androidx.annotation.RestrictTo.Scope.LIBRARY
import androidx.core.graphics.drawable.IconCompat
-import androidx.slice.builders.ListBuilder.ICON_IMAGE
@RestrictTo(LIBRARY)
@DslMarker
@@ -247,7 +246,7 @@
fun tapSliceAction(
pendingIntent: PendingIntent,
icon: IconCompat,
- @ListBuilder.ImageMode imageMode: Int = ICON_IMAGE,
+ @ListBuilder.ImageMode imageMode: Int = ListBuilder.ICON_IMAGE,
title: CharSequence
) = SliceAction(pendingIntent, icon, imageMode, title)
diff --git a/slice/slice-view/src/main/java/androidx/slice/widget/RowView.java b/slice/slice-view/src/main/java/androidx/slice/widget/RowView.java
index 3bbf8bd..dd01abd 100644
--- a/slice/slice-view/src/main/java/androidx/slice/widget/RowView.java
+++ b/slice/slice-view/src/main/java/androidx/slice/widget/RowView.java
@@ -99,7 +99,6 @@
import androidx.annotation.RestrictTo;
import androidx.core.graphics.drawable.DrawableCompat;
import androidx.core.graphics.drawable.IconCompat;
-import androidx.core.view.ViewCompat;
import androidx.slice.CornerDrawable;
import androidx.slice.SliceItem;
import androidx.slice.SliceStructure;
@@ -232,9 +231,8 @@
mActionSpinner = findViewById(R.id.action_sent_indicator);
SliceViewUtil.tintIndeterminateProgressBar(getContext(), mActionSpinner);
mEndContainer = findViewById(android.R.id.widget_frame);
- ViewCompat.setImportantForAccessibility(this, ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO);
- ViewCompat.setImportantForAccessibility(
- mContent, ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO);
+ setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO);
+ mContent.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO);
}
/**
@@ -695,9 +693,9 @@
mShowActionSpinner = true;
}
- ViewCompat.setImportantForAccessibility(mRootView, mRootView.isClickable()
- ? ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_AUTO
- : ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO
+ mRootView.setImportantForAccessibility(mRootView.isClickable()
+ ? View.IMPORTANT_FOR_ACCESSIBILITY_AUTO
+ : View.IMPORTANT_FOR_ACCESSIBILITY_NO
);
}
diff --git a/slidingpanelayout/slidingpanelayout/src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.kt b/slidingpanelayout/slidingpanelayout/src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.kt
index e1927f2..ecb153b 100644
--- a/slidingpanelayout/slidingpanelayout/src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.kt
+++ b/slidingpanelayout/slidingpanelayout/src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.kt
@@ -595,7 +595,7 @@
init {
setWillNotDraw(false)
ViewCompat.setAccessibilityDelegate(this, AccessibilityDelegate())
- ViewCompat.setImportantForAccessibility(this, ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES)
+ setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES)
context.withStyledAttributes(
attrs,
@@ -1796,7 +1796,7 @@
info.className =
ACCESSIBILITY_CLASS_NAME
info.setSource(host)
- val parent = ViewCompat.getParentForAccessibility(host)
+ val parent = host.getParentForAccessibility()
if (parent is View) {
info.setParent(parent as View)
}
@@ -1808,9 +1808,7 @@
val child = getChildAt(i)
if (!filter(child) && child.visibility == VISIBLE) {
// Force importance to "yes" since we can't read the value.
- ViewCompat.setImportantForAccessibility(
- child, ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES
- )
+ child.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES)
info.addChild(child)
}
}
diff --git a/sqlite/sqlite-framework/lint-baseline.xml b/sqlite/sqlite-framework/lint-baseline.xml
index 81a9b1f..a7eaf0d 100644
--- a/sqlite/sqlite-framework/lint-baseline.xml
+++ b/sqlite/sqlite-framework/lint-baseline.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.3.0-alpha04" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha04)" variant="all" version="8.3.0-alpha04">
+<issues format="6" by="lint 8.3.0-alpha10" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.0-alpha10)" variant="all" version="8.3.0-alpha10">
<issue
id="BanThreadSleep"
@@ -7,7 +7,7 @@
errorLine1=" Thread.sleep(500)"
errorLine2=" ~~~~~">
<location
- file="src/androidMain/kotlin/androidx/sqlite/db/framework/FrameworkSQLiteOpenHelper.kt"/>
+ file="src/androidMain/kotlin/androidx/sqlite/db/framework/FrameworkSQLiteOpenHelper.android.kt"/>
</issue>
</issues>
diff --git a/sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/db/framework/FrameworkSQLiteDatabase.kt b/sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/db/framework/FrameworkSQLiteDatabase.android.kt
similarity index 100%
rename from sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/db/framework/FrameworkSQLiteDatabase.kt
rename to sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/db/framework/FrameworkSQLiteDatabase.android.kt
diff --git a/sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/db/framework/FrameworkSQLiteOpenHelper.kt b/sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/db/framework/FrameworkSQLiteOpenHelper.android.kt
similarity index 100%
rename from sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/db/framework/FrameworkSQLiteOpenHelper.kt
rename to sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/db/framework/FrameworkSQLiteOpenHelper.android.kt
diff --git a/sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/db/framework/FrameworkSQLiteOpenHelperFactory.kt b/sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/db/framework/FrameworkSQLiteOpenHelperFactory.android.kt
similarity index 100%
rename from sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/db/framework/FrameworkSQLiteOpenHelperFactory.kt
rename to sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/db/framework/FrameworkSQLiteOpenHelperFactory.android.kt
diff --git a/sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/db/framework/FrameworkSQLiteProgram.kt b/sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/db/framework/FrameworkSQLiteProgram.android.kt
similarity index 100%
rename from sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/db/framework/FrameworkSQLiteProgram.kt
rename to sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/db/framework/FrameworkSQLiteProgram.android.kt
diff --git a/sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/db/framework/FrameworkSQLiteStatement.kt b/sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/db/framework/FrameworkSQLiteStatement.android.kt
similarity index 100%
rename from sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/db/framework/FrameworkSQLiteStatement.kt
rename to sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/db/framework/FrameworkSQLiteStatement.android.kt
diff --git a/sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/driver/AndroidSQLite.kt b/sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/driver/AndroidSQLite.android.kt
similarity index 100%
rename from sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/driver/AndroidSQLite.kt
rename to sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/driver/AndroidSQLite.android.kt
diff --git a/sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/driver/AndroidSQLiteConnection.kt b/sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/driver/AndroidSQLiteConnection.android.kt
similarity index 100%
rename from sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/driver/AndroidSQLiteConnection.kt
rename to sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/driver/AndroidSQLiteConnection.android.kt
diff --git a/sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/driver/AndroidSQLiteDriver.kt b/sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/driver/AndroidSQLiteDriver.android.kt
similarity index 100%
rename from sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/driver/AndroidSQLiteDriver.kt
rename to sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/driver/AndroidSQLiteDriver.android.kt
diff --git a/sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/driver/AndroidSQLiteStatement.kt b/sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/driver/AndroidSQLiteStatement.android.kt
similarity index 100%
rename from sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/driver/AndroidSQLiteStatement.kt
rename to sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/driver/AndroidSQLiteStatement.android.kt
diff --git a/sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/util/ProcessLock.kt b/sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/util/ProcessLock.android.kt
similarity index 100%
rename from sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/util/ProcessLock.kt
rename to sqlite/sqlite-framework/src/androidMain/kotlin/androidx/sqlite/util/ProcessLock.android.kt
diff --git a/sqlite/sqlite/src/androidMain/kotlin/androidx/sqlite/db/SimpleSQLiteQuery.kt b/sqlite/sqlite/src/androidMain/kotlin/androidx/sqlite/db/SimpleSQLiteQuery.android.kt
similarity index 100%
rename from sqlite/sqlite/src/androidMain/kotlin/androidx/sqlite/db/SimpleSQLiteQuery.kt
rename to sqlite/sqlite/src/androidMain/kotlin/androidx/sqlite/db/SimpleSQLiteQuery.android.kt
diff --git a/sqlite/sqlite/src/androidMain/kotlin/androidx/sqlite/db/SupportSQLiteCompat.kt b/sqlite/sqlite/src/androidMain/kotlin/androidx/sqlite/db/SupportSQLiteCompat.android.kt
similarity index 100%
rename from sqlite/sqlite/src/androidMain/kotlin/androidx/sqlite/db/SupportSQLiteCompat.kt
rename to sqlite/sqlite/src/androidMain/kotlin/androidx/sqlite/db/SupportSQLiteCompat.android.kt
diff --git a/sqlite/sqlite/src/androidMain/kotlin/androidx/sqlite/db/SupportSQLiteDatabase.kt b/sqlite/sqlite/src/androidMain/kotlin/androidx/sqlite/db/SupportSQLiteDatabase.android.kt
similarity index 100%
rename from sqlite/sqlite/src/androidMain/kotlin/androidx/sqlite/db/SupportSQLiteDatabase.kt
rename to sqlite/sqlite/src/androidMain/kotlin/androidx/sqlite/db/SupportSQLiteDatabase.android.kt
diff --git a/sqlite/sqlite/src/androidMain/kotlin/androidx/sqlite/db/SupportSQLiteOpenHelper.kt b/sqlite/sqlite/src/androidMain/kotlin/androidx/sqlite/db/SupportSQLiteOpenHelper.android.kt
similarity index 100%
rename from sqlite/sqlite/src/androidMain/kotlin/androidx/sqlite/db/SupportSQLiteOpenHelper.kt
rename to sqlite/sqlite/src/androidMain/kotlin/androidx/sqlite/db/SupportSQLiteOpenHelper.android.kt
diff --git a/sqlite/sqlite/src/androidMain/kotlin/androidx/sqlite/db/SupportSQLiteProgram.kt b/sqlite/sqlite/src/androidMain/kotlin/androidx/sqlite/db/SupportSQLiteProgram.android.kt
similarity index 100%
rename from sqlite/sqlite/src/androidMain/kotlin/androidx/sqlite/db/SupportSQLiteProgram.kt
rename to sqlite/sqlite/src/androidMain/kotlin/androidx/sqlite/db/SupportSQLiteProgram.android.kt
diff --git a/sqlite/sqlite/src/androidMain/kotlin/androidx/sqlite/db/SupportSQLiteQuery.kt b/sqlite/sqlite/src/androidMain/kotlin/androidx/sqlite/db/SupportSQLiteQuery.android.kt
similarity index 100%
rename from sqlite/sqlite/src/androidMain/kotlin/androidx/sqlite/db/SupportSQLiteQuery.kt
rename to sqlite/sqlite/src/androidMain/kotlin/androidx/sqlite/db/SupportSQLiteQuery.android.kt
diff --git a/sqlite/sqlite/src/androidMain/kotlin/androidx/sqlite/db/SupportSQLiteQueryBuilder.kt b/sqlite/sqlite/src/androidMain/kotlin/androidx/sqlite/db/SupportSQLiteQueryBuilder.android.kt
similarity index 100%
rename from sqlite/sqlite/src/androidMain/kotlin/androidx/sqlite/db/SupportSQLiteQueryBuilder.kt
rename to sqlite/sqlite/src/androidMain/kotlin/androidx/sqlite/db/SupportSQLiteQueryBuilder.android.kt
diff --git a/sqlite/sqlite/src/androidMain/kotlin/androidx/sqlite/db/SupportSQLiteStatement.kt b/sqlite/sqlite/src/androidMain/kotlin/androidx/sqlite/db/SupportSQLiteStatement.android.kt
similarity index 100%
rename from sqlite/sqlite/src/androidMain/kotlin/androidx/sqlite/db/SupportSQLiteStatement.kt
rename to sqlite/sqlite/src/androidMain/kotlin/androidx/sqlite/db/SupportSQLiteStatement.android.kt
diff --git a/swiperefreshlayout/swiperefreshlayout/src/main/java/androidx/swiperefreshlayout/widget/CircleImageView.java b/swiperefreshlayout/swiperefreshlayout/src/main/java/androidx/swiperefreshlayout/widget/CircleImageView.java
index 9af99fb..c33fd2a3 100644
--- a/swiperefreshlayout/swiperefreshlayout/src/main/java/androidx/swiperefreshlayout/widget/CircleImageView.java
+++ b/swiperefreshlayout/swiperefreshlayout/src/main/java/androidx/swiperefreshlayout/widget/CircleImageView.java
@@ -87,7 +87,7 @@
setPadding(padding, padding, padding, padding);
}
circle.getPaint().setColor(mBackgroundColor);
- ViewCompat.setBackground(this, circle);
+ setBackground(circle);
}
private boolean elevationSupported() {
diff --git a/swiperefreshlayout/swiperefreshlayout/src/main/java/androidx/swiperefreshlayout/widget/SwipeRefreshLayout.java b/swiperefreshlayout/swiperefreshlayout/src/main/java/androidx/swiperefreshlayout/widget/SwipeRefreshLayout.java
index f7d24cc..1daa440 100644
--- a/swiperefreshlayout/swiperefreshlayout/src/main/java/androidx/swiperefreshlayout/widget/SwipeRefreshLayout.java
+++ b/swiperefreshlayout/swiperefreshlayout/src/main/java/androidx/swiperefreshlayout/widget/SwipeRefreshLayout.java
@@ -51,7 +51,6 @@
import androidx.core.view.NestedScrollingParent3;
import androidx.core.view.NestedScrollingParentHelper;
import androidx.core.view.ViewCompat;
-import androidx.core.widget.ListViewCompat;
/**
* The SwipeRefreshLayout should be used whenever the user can refresh the
@@ -752,7 +751,7 @@
return mChildScrollUpCallback.canChildScrollUp(this, mTarget);
}
if (mTarget instanceof ListView) {
- return ListViewCompat.canScrollList((ListView) mTarget, -1);
+ return ((ListView) mTarget).canScrollList(-1);
}
return mTarget.canScrollVertically(-1);
}
diff --git a/testutils/testutils-datastore/src/jvmMain/kotlin/androidx/datastore/FileTestIO.kt b/testutils/testutils-datastore/src/jvmMain/kotlin/androidx/datastore/FileTestIO.jvm.kt
similarity index 100%
rename from testutils/testutils-datastore/src/jvmMain/kotlin/androidx/datastore/FileTestIO.kt
rename to testutils/testutils-datastore/src/jvmMain/kotlin/androidx/datastore/FileTestIO.jvm.kt
diff --git a/testutils/testutils-datastore/src/jvmMain/kotlin/androidx/datastore/TestingSerializer.kt b/testutils/testutils-datastore/src/jvmMain/kotlin/androidx/datastore/TestingSerializer.jvm.kt
similarity index 100%
rename from testutils/testutils-datastore/src/jvmMain/kotlin/androidx/datastore/TestingSerializer.kt
rename to testutils/testutils-datastore/src/jvmMain/kotlin/androidx/datastore/TestingSerializer.jvm.kt
diff --git a/testutils/testutils-fonts/src/commonMain/java/androidx/testutils/WeightStyleFont.kt b/testutils/testutils-fonts/src/commonMain/java/androidx/testutils/WeightStyleFont.android.kt
similarity index 100%
rename from testutils/testutils-fonts/src/commonMain/java/androidx/testutils/WeightStyleFont.kt
rename to testutils/testutils-fonts/src/commonMain/java/androidx/testutils/WeightStyleFont.android.kt
diff --git a/testutils/testutils-ktx/src/jvmMain/kotlin/androidx/testutils/MainDispatcherRule.kt b/testutils/testutils-ktx/src/jvmMain/kotlin/androidx/testutils/MainDispatcherRule.jvm.kt
similarity index 100%
rename from testutils/testutils-ktx/src/jvmMain/kotlin/androidx/testutils/MainDispatcherRule.kt
rename to testutils/testutils-ktx/src/jvmMain/kotlin/androidx/testutils/MainDispatcherRule.jvm.kt
diff --git a/testutils/testutils-paging/src/commonMain/kotlin/androidx/paging/TestPagingDataPresenter.kt b/testutils/testutils-paging/src/commonMain/kotlin/androidx/paging/TestPagingDataPresenter.kt
index 8597658..2a732bc 100644
--- a/testutils/testutils-paging/src/commonMain/kotlin/androidx/paging/TestPagingDataPresenter.kt
+++ b/testutils/testutils-paging/src/commonMain/kotlin/androidx/paging/TestPagingDataPresenter.kt
@@ -24,15 +24,6 @@
val currentList: List<T> get() = List(size) { i -> get(i)!! }
- override suspend fun presentNewList(
- previousList: NullPaddedList<T>,
- newList: NullPaddedList<T>,
- lastAccessedIndex: Int,
- onListPresentable: () -> Unit,
- ) {
- onListPresentable()
- }
-
companion object {
private val noopDifferCallback = object : DifferCallback {
override fun onChanged(position: Int, count: Int) {}
diff --git a/testutils/testutils-paging/src/jvmMain/kotlin/androidx/paging/LoadStateCapture.kt b/testutils/testutils-paging/src/jvmMain/kotlin/androidx/paging/LoadStateCapture.jvm.kt
similarity index 100%
rename from testutils/testutils-paging/src/jvmMain/kotlin/androidx/paging/LoadStateCapture.kt
rename to testutils/testutils-paging/src/jvmMain/kotlin/androidx/paging/LoadStateCapture.jvm.kt
diff --git a/testutils/testutils-paging/src/jvmMain/kotlin/androidx/paging/TestItemKeyedDataSource.kt b/testutils/testutils-paging/src/jvmMain/kotlin/androidx/paging/TestItemKeyedDataSource.jvm.kt
similarity index 100%
rename from testutils/testutils-paging/src/jvmMain/kotlin/androidx/paging/TestItemKeyedDataSource.kt
rename to testutils/testutils-paging/src/jvmMain/kotlin/androidx/paging/TestItemKeyedDataSource.jvm.kt
diff --git a/testutils/testutils-paging/src/jvmMain/kotlin/androidx/paging/TestPageKeyedDataSource.kt b/testutils/testutils-paging/src/jvmMain/kotlin/androidx/paging/TestPageKeyedDataSource.jvm.kt
similarity index 100%
rename from testutils/testutils-paging/src/jvmMain/kotlin/androidx/paging/TestPageKeyedDataSource.kt
rename to testutils/testutils-paging/src/jvmMain/kotlin/androidx/paging/TestPageKeyedDataSource.jvm.kt
diff --git a/testutils/testutils-paging/src/jvmMain/kotlin/androidx/paging/TestPositionalDataSource.kt b/testutils/testutils-paging/src/jvmMain/kotlin/androidx/paging/TestPositionalDataSource.jvm.kt
similarity index 100%
rename from testutils/testutils-paging/src/jvmMain/kotlin/androidx/paging/TestPositionalDataSource.kt
rename to testutils/testutils-paging/src/jvmMain/kotlin/androidx/paging/TestPositionalDataSource.jvm.kt
diff --git a/testutils/testutils-runtime/src/androidTest/java/androidx/testutils/LocaleTestUtilsTest.kt b/testutils/testutils-runtime/src/androidTest/java/androidx/testutils/LocaleTestUtilsTest.kt
index 7836624..635d871 100644
--- a/testutils/testutils-runtime/src/androidTest/java/androidx/testutils/LocaleTestUtilsTest.kt
+++ b/testutils/testutils-runtime/src/androidTest/java/androidx/testutils/LocaleTestUtilsTest.kt
@@ -18,9 +18,8 @@
import android.content.Context
import android.content.res.Configuration
+import android.view.View
import androidx.core.os.ConfigurationCompat
-import androidx.core.view.ViewCompat.LAYOUT_DIRECTION_LTR
-import androidx.core.view.ViewCompat.LAYOUT_DIRECTION_RTL
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
@@ -117,7 +116,9 @@
assertThat(
"Layout direction should be ${if (expectRtl) "RTL" else "LTR"}",
configuration.layoutDirection,
- CoreMatchers.equalTo(if (expectRtl) LAYOUT_DIRECTION_RTL else LAYOUT_DIRECTION_LTR)
+ CoreMatchers.equalTo(
+ if (expectRtl) View.LAYOUT_DIRECTION_RTL else View.LAYOUT_DIRECTION_LTR
+ )
)
}
@@ -127,6 +128,6 @@
configuration.language,
CoreMatchers.equalTo(DEFAULT_LANGUAGE)
)
- expectRtlInDefaultLanguage = configuration.layoutDirection == LAYOUT_DIRECTION_RTL
+ expectRtlInDefaultLanguage = configuration.layoutDirection == View.LAYOUT_DIRECTION_RTL
}
}
diff --git a/transition/transition/src/androidTest/java/androidx/transition/ChangeClipBoundsTest.java b/transition/transition/src/androidTest/java/androidx/transition/ChangeClipBoundsTest.java
index b1d6ce8..475b59e 100644
--- a/transition/transition/src/androidTest/java/androidx/transition/ChangeClipBoundsTest.java
+++ b/transition/transition/src/androidTest/java/androidx/transition/ChangeClipBoundsTest.java
@@ -32,7 +32,6 @@
import android.view.View;
import android.view.ViewGroup;
-import androidx.core.view.ViewCompat;
import androidx.test.filters.LargeTest;
import androidx.test.filters.SdkSuppress;
@@ -66,9 +65,9 @@
rule.runOnUiThread(new Runnable() {
@Override
public void run() {
- assertNull(ViewCompat.getClipBounds(redSquare));
+ assertNull(redSquare.getClipBounds());
TransitionManager.beginDelayedTransition(mRoot, mTransition);
- ViewCompat.setClipBounds(redSquare, newClip);
+ redSquare.setClipBounds(newClip);
}
});
waitForStart();
@@ -79,7 +78,7 @@
rule.runOnUiThread(new Runnable() {
@Override
public void run() {
- final Rect endRect = ViewCompat.getClipBounds(redSquare);
+ final Rect endRect = redSquare.getClipBounds();
assertNotNull(endRect);
assertEquals(newClip, endRect);
}
@@ -91,7 +90,7 @@
@Override
public void run() {
TransitionManager.beginDelayedTransition(mRoot, mTransition);
- ViewCompat.setClipBounds(redSquare, null);
+ redSquare.setClipBounds(null);
}
});
waitForStart();
@@ -102,7 +101,7 @@
rule.runOnUiThread(new Runnable() {
@Override
public void run() {
- assertNull(ViewCompat.getClipBounds(redSquare));
+ assertNull(redSquare.getClipBounds());
}
});
diff --git a/transition/transition/src/androidTest/java/androidx/transition/GhostViewTest.java b/transition/transition/src/androidTest/java/androidx/transition/GhostViewTest.java
index 3d38f1a..bd58f79 100644
--- a/transition/transition/src/androidTest/java/androidx/transition/GhostViewTest.java
+++ b/transition/transition/src/androidTest/java/androidx/transition/GhostViewTest.java
@@ -36,7 +36,6 @@
import android.view.ViewTreeObserver;
import android.widget.FrameLayout;
-import androidx.core.view.ViewCompat;
import androidx.test.annotation.UiThreadTest;
import androidx.test.filters.MediumTest;
@@ -60,7 +59,7 @@
mContext = rule.getActivity();
mRoot = new FrameLayout(mContext);
rule.getActivity().getRoot().addView(mRoot, new ViewGroup.LayoutParams(SIZE, SIZE));
- ViewCompat.setBackground(rule.getActivity().getRoot(), new ColorDrawable(Color.WHITE));
+ rule.getActivity().getRoot().setBackground(new ColorDrawable(Color.WHITE));
}
@Test
@@ -311,7 +310,7 @@
private View makeColorView(int color) {
View view = new View(mContext);
- ViewCompat.setBackground(view, new ColorDrawable(color));
+ view.setBackground(new ColorDrawable(color));
return view;
}
diff --git a/transition/transition/src/main/java/androidx/transition/ChangeBounds.java b/transition/transition/src/main/java/androidx/transition/ChangeBounds.java
index e72333d..89077d0 100644
--- a/transition/transition/src/main/java/androidx/transition/ChangeBounds.java
+++ b/transition/transition/src/main/java/androidx/transition/ChangeBounds.java
@@ -35,7 +35,6 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.res.TypedArrayUtils;
-import androidx.core.view.ViewCompat;
import java.util.Map;
@@ -199,12 +198,12 @@
private void captureValues(TransitionValues values) {
View view = values.view;
- if (ViewCompat.isLaidOut(view) || view.getWidth() != 0 || view.getHeight() != 0) {
+ if (view.isLaidOut() || view.getWidth() != 0 || view.getHeight() != 0) {
values.values.put(PROPNAME_BOUNDS, new Rect(view.getLeft(), view.getTop(),
view.getRight(), view.getBottom()));
values.values.put(PROPNAME_PARENT, values.view.getParent());
if (mResizeClip) {
- values.values.put(PROPNAME_CLIP, ViewCompat.getClipBounds(view));
+ values.values.put(PROPNAME_CLIP, view.getClipBounds());
}
}
}
@@ -333,7 +332,7 @@
}
ObjectAnimator clipAnimator = null;
if (!startClip.equals(endClip)) {
- ViewCompat.setClipBounds(view, startClip);
+ view.setClipBounds(startClip);
clipAnimator = ObjectAnimator.ofObject(view, "clipBounds", sRectEvaluator,
startClip, endClip);
ClipListener listener = new ClipListener(view,
@@ -457,7 +456,7 @@
ViewUtils.setLeftTopRightBottom(mView, left, top, left + maxWidth, top + maxHeight);
Rect clip = isReverse ? mEndClip : mStartClip;
- ViewCompat.setClipBounds(mView, clip);
+ mView.setClipBounds(clip);
}
@Override
@@ -468,7 +467,7 @@
Rect clip = isReverse
? (mStartClipIsNull ? null : mStartClip)
: (mEndClipIsNull ? null : mEndClip);
- ViewCompat.setClipBounds(mView, clip);
+ mView.setClipBounds(clip);
if (isReverse) {
ViewUtils.setLeftTopRightBottom(mView, mStartLeft, mStartTop, mStartRight,
mStartBottom);
@@ -484,17 +483,17 @@
@Override
public void onTransitionPause(@NonNull Transition transition) {
- Rect pauseClip = ViewCompat.getClipBounds(mView);
+ Rect pauseClip = mView.getClipBounds();
mView.setTag(R.id.transition_clip, pauseClip);
Rect clip = mEndClipIsNull ? null : mEndClip;
- ViewCompat.setClipBounds(mView, clip);
+ mView.setClipBounds(clip);
}
@Override
public void onTransitionResume(@NonNull Transition transition) {
Rect pauseClip = (Rect) mView.getTag(R.id.transition_clip);
mView.setTag(R.id.transition_clip, null);
- ViewCompat.setClipBounds(mView, pauseClip);
+ mView.setClipBounds(pauseClip);
}
@Override
diff --git a/transition/transition/src/main/java/androidx/transition/ChangeClipBounds.java b/transition/transition/src/main/java/androidx/transition/ChangeClipBounds.java
index bcd40a3..0d1d14e 100644
--- a/transition/transition/src/main/java/androidx/transition/ChangeClipBounds.java
+++ b/transition/transition/src/main/java/androidx/transition/ChangeClipBounds.java
@@ -27,7 +27,6 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.core.view.ViewCompat;
/**
* ChangeClipBounds captures the {@link android.view.View#getClipBounds()} before and after the
@@ -78,7 +77,7 @@
clip = (Rect) view.getTag(R.id.transition_clip);
}
if (clip == null) {
- clip = ViewCompat.getClipBounds(view);
+ clip = view.getClipBounds();
}
if (clip == NULL_SENTINEL) {
clip = null;
@@ -123,7 +122,7 @@
return null;
}
- ViewCompat.setClipBounds(endValues.view, start);
+ endValues.view.setClipBounds(start);
RectEvaluator evaluator = new RectEvaluator(new Rect());
ObjectAnimator animator = ObjectAnimator.ofObject(endValues.view, ViewUtils.CLIP_BOUNDS,
evaluator, startClip, endClip);
@@ -162,18 +161,18 @@
@Override
public void onTransitionPause(@NonNull Transition transition) {
- Rect clipBounds = ViewCompat.getClipBounds(mView);
+ Rect clipBounds = mView.getClipBounds();
if (clipBounds == null) {
clipBounds = NULL_SENTINEL;
}
mView.setTag(R.id.transition_clip, clipBounds);
- ViewCompat.setClipBounds(mView, mEnd);
+ mView.setClipBounds(mEnd);
}
@Override
public void onTransitionResume(@NonNull Transition transition) {
Rect clipBounds = (Rect) mView.getTag(R.id.transition_clip);
- ViewCompat.setClipBounds(mView, clipBounds);
+ mView.setClipBounds(clipBounds);
mView.setTag(R.id.transition_clip, null);
}
@@ -185,9 +184,9 @@
@Override
public void onAnimationEnd(Animator animation, boolean isReverse) {
if (!isReverse) {
- ViewCompat.setClipBounds(mView, mEnd);
+ mView.setClipBounds(mEnd);
} else {
- ViewCompat.setClipBounds(mView, mStart);
+ mView.setClipBounds(mStart);
}
}
}
diff --git a/transition/transition/src/main/java/androidx/transition/Fade.java b/transition/transition/src/main/java/androidx/transition/Fade.java
index 039e19b..4ce248e 100644
--- a/transition/transition/src/main/java/androidx/transition/Fade.java
+++ b/transition/transition/src/main/java/androidx/transition/Fade.java
@@ -31,7 +31,6 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.res.TypedArrayUtils;
-import androidx.core.view.ViewCompat;
/**
* This transition tracks changes to the visibility of target views in the
@@ -199,7 +198,7 @@
@Override
public void onAnimationStart(Animator animation) {
- if (ViewCompat.hasOverlappingRendering(mView)
+ if (mView.hasOverlappingRendering()
&& mView.getLayerType() == View.LAYER_TYPE_NONE) {
mLayerTypeChanged = true;
mView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
diff --git a/transition/transition/src/main/java/androidx/transition/GhostViewPort.java b/transition/transition/src/main/java/androidx/transition/GhostViewPort.java
index b82927d..7e4a8e9 100644
--- a/transition/transition/src/main/java/androidx/transition/GhostViewPort.java
+++ b/transition/transition/src/main/java/androidx/transition/GhostViewPort.java
@@ -25,7 +25,6 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.core.view.ViewCompat;
/**
* Backport of android.view.GhostView introduced in API level 21.
@@ -53,10 +52,10 @@
@Override
public boolean onPreDraw() {
// We draw the view.
- ViewCompat.postInvalidateOnAnimation(GhostViewPort.this);
+ GhostViewPort.this.postInvalidateOnAnimation();
if (mStartParent != null && mStartView != null) {
mStartParent.endViewTransition(mStartView);
- ViewCompat.postInvalidateOnAnimation(mStartParent);
+ mStartParent.postInvalidateOnAnimation();
mStartParent = null;
mStartView = null;
}
diff --git a/transition/transition/src/main/java/androidx/transition/SidePropagation.java b/transition/transition/src/main/java/androidx/transition/SidePropagation.java
index 8e85055..e7198e1 100644
--- a/transition/transition/src/main/java/androidx/transition/SidePropagation.java
+++ b/transition/transition/src/main/java/androidx/transition/SidePropagation.java
@@ -23,7 +23,6 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.core.view.ViewCompat;
/**
* A <code>TransitionPropagation</code> that propagates based on the distance to the side
@@ -125,12 +124,12 @@
int left, int top, int right, int bottom) {
final int side;
if (mSide == Gravity.START) {
- final boolean isRtl = ViewCompat.getLayoutDirection(sceneRoot)
- == ViewCompat.LAYOUT_DIRECTION_RTL;
+ final boolean isRtl = sceneRoot.getLayoutDirection()
+ == View.LAYOUT_DIRECTION_RTL;
side = isRtl ? Gravity.RIGHT : Gravity.LEFT;
} else if (mSide == Gravity.END) {
- final boolean isRtl = ViewCompat.getLayoutDirection(sceneRoot)
- == ViewCompat.LAYOUT_DIRECTION_RTL;
+ final boolean isRtl = sceneRoot.getLayoutDirection()
+ == View.LAYOUT_DIRECTION_RTL;
side = isRtl ? Gravity.LEFT : Gravity.RIGHT;
} else {
side = mSide;
diff --git a/transition/transition/src/main/java/androidx/transition/Slide.java b/transition/transition/src/main/java/androidx/transition/Slide.java
index 62d2dcf..ea0f60d 100644
--- a/transition/transition/src/main/java/androidx/transition/Slide.java
+++ b/transition/transition/src/main/java/androidx/transition/Slide.java
@@ -35,7 +35,6 @@
import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.core.content.res.TypedArrayUtils;
-import androidx.core.view.ViewCompat;
import org.xmlpull.v1.XmlPullParser;
@@ -100,8 +99,8 @@
private static final CalculateSlide sCalculateStart = new CalculateSlideHorizontal() {
@Override
public float getGoneX(ViewGroup sceneRoot, View view) {
- final boolean isRtl = ViewCompat.getLayoutDirection(sceneRoot)
- == ViewCompat.LAYOUT_DIRECTION_RTL;
+ final boolean isRtl = sceneRoot.getLayoutDirection()
+ == View.LAYOUT_DIRECTION_RTL;
final float x;
if (isRtl) {
x = view.getTranslationX() + sceneRoot.getWidth();
@@ -129,8 +128,8 @@
private static final CalculateSlide sCalculateEnd = new CalculateSlideHorizontal() {
@Override
public float getGoneX(ViewGroup sceneRoot, View view) {
- final boolean isRtl = ViewCompat.getLayoutDirection(sceneRoot)
- == ViewCompat.LAYOUT_DIRECTION_RTL;
+ final boolean isRtl = sceneRoot.getLayoutDirection()
+ == View.LAYOUT_DIRECTION_RTL;
final float x;
if (isRtl) {
x = view.getTranslationX() - sceneRoot.getWidth();
diff --git a/transition/transition/src/main/java/androidx/transition/Transition.java b/transition/transition/src/main/java/androidx/transition/Transition.java
index fc34dc5..89bb535 100644
--- a/transition/transition/src/main/java/androidx/transition/Transition.java
+++ b/transition/transition/src/main/java/androidx/transition/Transition.java
@@ -1667,11 +1667,11 @@
// Duplicate item IDs: cannot match by item ID.
View alreadyMatched = transitionValuesMaps.mItemIdValues.get(itemId);
if (alreadyMatched != null) {
- ViewCompat.setHasTransientState(alreadyMatched, false);
+ alreadyMatched.setHasTransientState(false);
transitionValuesMaps.mItemIdValues.put(itemId, null);
}
} else {
- ViewCompat.setHasTransientState(view, true);
+ view.setHasTransientState(true);
transitionValuesMaps.mItemIdValues.put(itemId, view);
}
}
@@ -2073,13 +2073,13 @@
for (int i = 0; i < mStartValues.mItemIdValues.size(); ++i) {
View view = mStartValues.mItemIdValues.valueAt(i);
if (view != null) {
- ViewCompat.setHasTransientState(view, false);
+ view.setHasTransientState(false);
}
}
for (int i = 0; i < mEndValues.mItemIdValues.size(); ++i) {
View view = mEndValues.mItemIdValues.valueAt(i);
if (view != null) {
- ViewCompat.setHasTransientState(view, false);
+ view.setHasTransientState(false);
}
}
mEnded = true;
diff --git a/transition/transition/src/main/java/androidx/transition/TransitionManager.java b/transition/transition/src/main/java/androidx/transition/TransitionManager.java
index 261738f4..78aa1a0 100644
--- a/transition/transition/src/main/java/androidx/transition/TransitionManager.java
+++ b/transition/transition/src/main/java/androidx/transition/TransitionManager.java
@@ -27,7 +27,6 @@
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.collection.ArrayMap;
-import androidx.core.view.ViewCompat;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
@@ -362,7 +361,7 @@
* another Transition is being captured for {@code sceneRoot}, or {@code sceneRoot} hasn't
* had a layout yet.
* @throws IllegalArgumentException if {@code transition} returns {@code false} from
- * {@link Transition#isSeekingSupported()}.
+ * {@link Transition#isSeekingSupported()}.
*/
@Nullable
public static TransitionSeekController createSeekController(
@@ -378,7 +377,7 @@
return null; // Already in the process of transitioning
}
Scene oldScene = Scene.getCurrentScene(sceneRoot);
- if (!ViewCompat.isLaidOut(sceneRoot)
+ if (!sceneRoot.isLaidOut()
|| Build.VERSION.SDK_INT < Build.VERSION_CODES.UPSIDE_DOWN_CAKE
) {
// Can't control it, so just change the scene immediately
@@ -458,7 +457,7 @@
*/
public static void beginDelayedTransition(@NonNull final ViewGroup sceneRoot,
@Nullable Transition transition) {
- if (!sPendingTransitions.contains(sceneRoot) && ViewCompat.isLaidOut(sceneRoot)) {
+ if (!sPendingTransitions.contains(sceneRoot) && sceneRoot.isLaidOut()) {
if (Transition.DBG) {
Log.d(LOG_TAG, "beginDelayedTransition: root, transition = "
+ sceneRoot + ", " + transition);
@@ -498,14 +497,14 @@
* another Transition is being captured for {@code sceneRoot}, or {@code sceneRoot} hasn't
* had a layout yet.
* @throws IllegalArgumentException if {@code transition} returns {@code false} from
- * {@link Transition#isSeekingSupported()}.
+ * {@link Transition#isSeekingSupported()}.
*/
@Nullable
public static TransitionSeekController controlDelayedTransition(
@NonNull final ViewGroup sceneRoot,
@NonNull Transition transition
) {
- if (sPendingTransitions.contains(sceneRoot) || !ViewCompat.isLaidOut(sceneRoot)
+ if (sPendingTransitions.contains(sceneRoot) || !sceneRoot.isLaidOut()
|| Build.VERSION.SDK_INT < 34) {
return null;
}
diff --git a/transition/transition/src/main/java/androidx/transition/ViewUtils.java b/transition/transition/src/main/java/androidx/transition/ViewUtils.java
index ee69e47..16de6e6 100644
--- a/transition/transition/src/main/java/androidx/transition/ViewUtils.java
+++ b/transition/transition/src/main/java/androidx/transition/ViewUtils.java
@@ -24,7 +24,6 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.core.view.ViewCompat;
/**
* Compatibility utilities for platform features of {@link View}.
@@ -71,12 +70,12 @@
@Override
public Rect get(View view) {
- return ViewCompat.getClipBounds(view);
+ return view.getClipBounds();
}
@Override
public void set(View view, Rect clipBounds) {
- ViewCompat.setClipBounds(view, clipBounds);
+ view.setClipBounds(clipBounds);
}
};
diff --git a/vectordrawable/integration-tests/testapp/src/main/java/com/example/android/support/vectordrawable/app/SimpleStaticVectorDrawable.java b/vectordrawable/integration-tests/testapp/src/main/java/com/example/android/support/vectordrawable/app/SimpleStaticVectorDrawable.java
index 48b7a5b..81537bd 100644
--- a/vectordrawable/integration-tests/testapp/src/main/java/com/example/android/support/vectordrawable/app/SimpleStaticVectorDrawable.java
+++ b/vectordrawable/integration-tests/testapp/src/main/java/com/example/android/support/vectordrawable/app/SimpleStaticVectorDrawable.java
@@ -88,7 +88,7 @@
LinearLayout container = new LinearLayout(this);
scrollView.addView(container);
container.setOrientation(LinearLayout.VERTICAL);
- final Resources res = this.getResources();
+ final Resources res = getResources();
final Resources.Theme theme = getTheme();
container.setBackgroundColor(0xFF888888);
VectorDrawableCompat[] d = new VectorDrawableCompat[mIcons.length];
diff --git a/vectordrawable/vectordrawable-animated/src/androidTest/java/androidx/vectordrawable/graphics/drawable/tests/AnimatedVectorDrawableTest.java b/vectordrawable/vectordrawable-animated/src/androidTest/java/androidx/vectordrawable/graphics/drawable/tests/AnimatedVectorDrawableTest.java
index 7aae59ba7..711c05c 100644
--- a/vectordrawable/vectordrawable-animated/src/androidTest/java/androidx/vectordrawable/graphics/drawable/tests/AnimatedVectorDrawableTest.java
+++ b/vectordrawable/vectordrawable-animated/src/androidTest/java/androidx/vectordrawable/graphics/drawable/tests/AnimatedVectorDrawableTest.java
@@ -40,7 +40,6 @@
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
-import androidx.core.view.ViewCompat;
import androidx.test.annotation.UiThreadTest;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.FlakyTest;
@@ -310,7 +309,7 @@
public void run() {
AnimatedVectorDrawableCompat avd = AnimatedVectorDrawableCompat.create(mContext,
R.drawable.animated_color_fill);
- ViewCompat.setBackground(imageButton, avd);
+ imageButton.setBackground(avd);
avd.start();
}
});
@@ -392,7 +391,7 @@
AnimatedVectorDrawableCompat avd = AnimatedVectorDrawableCompat.create(mContext,
R.drawable.animation_vector_drawable_grouping_1); // Duration is 50 ms.
- ViewCompat.setBackground(imageButton, avd);
+ imageButton.setBackground(avd);
return avd;
}
diff --git a/vectordrawable/vectordrawable/src/main/java/androidx/vectordrawable/graphics/drawable/VectorDrawableCompat.java b/vectordrawable/vectordrawable/src/main/java/androidx/vectordrawable/graphics/drawable/VectorDrawableCompat.java
index 2ae01e1..d1c0a37 100644
--- a/vectordrawable/vectordrawable/src/main/java/androidx/vectordrawable/graphics/drawable/VectorDrawableCompat.java
+++ b/vectordrawable/vectordrawable/src/main/java/androidx/vectordrawable/graphics/drawable/VectorDrawableCompat.java
@@ -50,6 +50,7 @@
import android.util.AttributeSet;
import android.util.Log;
import android.util.Xml;
+import android.view.View;
import androidx.annotation.ColorInt;
import androidx.annotation.DrawableRes;
@@ -63,7 +64,6 @@
import androidx.core.content.res.TypedArrayUtils;
import androidx.core.graphics.PathParser;
import androidx.core.graphics.drawable.DrawableCompat;
-import androidx.core.view.ViewCompat;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -919,7 +919,7 @@
// We don't support RTL auto mirroring since the getLayoutDirection() is for API 17+.
private boolean needMirroring() {
return isAutoMirrored()
- && DrawableCompat.getLayoutDirection(this) == ViewCompat.LAYOUT_DIRECTION_RTL;
+ && DrawableCompat.getLayoutDirection(this) == View.LAYOUT_DIRECTION_RTL;
}
// Extra override functions for delegation for SDK >= 7.
diff --git a/viewpager/viewpager/src/androidTest/java/android/support/v4/testutils/TestUtilsMatchers.java b/viewpager/viewpager/src/androidTest/java/android/support/v4/testutils/TestUtilsMatchers.java
index 0ab4152..240f725c 100644
--- a/viewpager/viewpager/src/androidTest/java/android/support/v4/testutils/TestUtilsMatchers.java
+++ b/viewpager/viewpager/src/androidTest/java/android/support/v4/testutils/TestUtilsMatchers.java
@@ -24,7 +24,6 @@
import android.view.ViewParent;
import androidx.annotation.ColorInt;
-import androidx.core.view.ViewCompat;
import androidx.test.espresso.matcher.BoundedMatcher;
import org.hamcrest.Description;
@@ -116,8 +115,8 @@
}
final ViewGroup parentGroup = (ViewGroup) parent;
- final int parentLayoutDirection = ViewCompat.getLayoutDirection(parentGroup);
- if (parentLayoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR) {
+ final int parentLayoutDirection = parentGroup.getLayoutDirection();
+ if (parentLayoutDirection == View.LAYOUT_DIRECTION_LTR) {
if (view.getLeft() == 0) {
return true;
} else {
@@ -162,8 +161,8 @@
}
final ViewGroup parentGroup = (ViewGroup) parent;
- final int parentLayoutDirection = ViewCompat.getLayoutDirection(parentGroup);
- if (parentLayoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR) {
+ final int parentLayoutDirection = parentGroup.getLayoutDirection();
+ if (parentLayoutDirection == View.LAYOUT_DIRECTION_LTR) {
if (view.getRight() == parentGroup.getWidth()) {
return true;
} else {
diff --git a/viewpager/viewpager/src/main/java/androidx/viewpager/widget/ViewPager.java b/viewpager/viewpager/src/main/java/androidx/viewpager/widget/ViewPager.java
index adcb306..5b36e33 100644
--- a/viewpager/viewpager/src/main/java/androidx/viewpager/widget/ViewPager.java
+++ b/viewpager/viewpager/src/main/java/androidx/viewpager/widget/ViewPager.java
@@ -429,10 +429,9 @@
ViewCompat.setAccessibilityDelegate(this, new MyAccessibilityDelegate());
- if (ViewCompat.getImportantForAccessibility(this)
- == ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
- ViewCompat.setImportantForAccessibility(this,
- ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES);
+ if (this.getImportantForAccessibility()
+ == View.IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
+ setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
}
ViewCompat.setOnApplyWindowInsetsListener(this,
@@ -1004,7 +1003,7 @@
// where we call computeScrollOffset().
mIsScrollStarted = false;
mScroller.startScroll(sx, sy, dx, dy, duration);
- ViewCompat.postInvalidateOnAnimation(this);
+ postInvalidateOnAnimation();
}
ItemInfo addNewItem(int position, int index) {
@@ -1803,7 +1802,7 @@
}
// Keep on drawing until the animation has finished.
- ViewCompat.postInvalidateOnAnimation(this);
+ postInvalidateOnAnimation();
return;
}
@@ -2120,7 +2119,7 @@
if (mIsBeingDragged) {
// Scroll to follow the motion event
if (performDrag(x, y)) {
- ViewCompat.postInvalidateOnAnimation(this);
+ postInvalidateOnAnimation();
}
}
break;
@@ -2319,7 +2318,7 @@
break;
}
if (needsInvalidate) {
- ViewCompat.postInvalidateOnAnimation(this);
+ postInvalidateOnAnimation();
}
return true;
}
@@ -2527,7 +2526,7 @@
if (needsInvalidate) {
// Keep animating
- ViewCompat.postInvalidateOnAnimation(this);
+ postInvalidateOnAnimation();
}
}
diff --git a/viewpager2/integration-tests/testapp/src/androidTest/java/androidx/viewpager2/integration/testapp/test/BaseTest.kt b/viewpager2/integration-tests/testapp/src/androidTest/java/androidx/viewpager2/integration/testapp/test/BaseTest.kt
index b211aef..c1588fa 100644
--- a/viewpager2/integration-tests/testapp/src/androidTest/java/androidx/viewpager2/integration/testapp/test/BaseTest.kt
+++ b/viewpager2/integration-tests/testapp/src/androidTest/java/androidx/viewpager2/integration/testapp/test/BaseTest.kt
@@ -19,7 +19,6 @@
import android.view.View
import androidx.annotation.LayoutRes
import androidx.core.text.TextUtilsCompat
-import androidx.core.view.ViewCompat
import androidx.fragment.app.FragmentActivity
import androidx.test.espresso.Espresso.onData
import androidx.test.espresso.Espresso.onIdle
@@ -67,7 +66,7 @@
lateinit var idleWatcher: ViewPagerIdleWatcher
lateinit var viewPager: ViewPager2
val isRtl = TextUtilsCompat.getLayoutDirectionFromLocale(Locale.getDefault()) ==
- ViewCompat.LAYOUT_DIRECTION_RTL
+ View.LAYOUT_DIRECTION_RTL
@Before
open fun setUp() {
diff --git a/viewpager2/integration-tests/testapp/src/androidTest/java/androidx/viewpager2/integration/testapp/test/util/ViewPagerActions.kt b/viewpager2/integration-tests/testapp/src/androidTest/java/androidx/viewpager2/integration/testapp/test/util/ViewPagerActions.kt
index 20b83eb..c84cef5 100644
--- a/viewpager2/integration-tests/testapp/src/androidTest/java/androidx/viewpager2/integration/testapp/test/util/ViewPagerActions.kt
+++ b/viewpager2/integration-tests/testapp/src/androidTest/java/androidx/viewpager2/integration/testapp/test/util/ViewPagerActions.kt
@@ -20,7 +20,6 @@
import android.os.SystemClock
import android.view.MotionEvent
import android.view.View
-import androidx.core.view.ViewCompat
import androidx.test.espresso.InjectEventSecurityException
import androidx.test.espresso.PerformException
import androidx.test.espresso.UiController
@@ -103,7 +102,7 @@
}
private fun ViewPager2.isRtl(): Boolean {
- return ViewCompat.getLayoutDirection(this) == ViewCompat.LAYOUT_DIRECTION_RTL
+ return getLayoutDirection() == View.LAYOUT_DIRECTION_RTL
}
}
diff --git a/viewpager2/integration-tests/testapp/src/main/java/androidx/viewpager2/integration/testapp/FakeDragActivity.kt b/viewpager2/integration-tests/testapp/src/main/java/androidx/viewpager2/integration/testapp/FakeDragActivity.kt
index 3024898..a873593 100644
--- a/viewpager2/integration-tests/testapp/src/main/java/androidx/viewpager2/integration/testapp/FakeDragActivity.kt
+++ b/viewpager2/integration-tests/testapp/src/main/java/androidx/viewpager2/integration/testapp/FakeDragActivity.kt
@@ -21,7 +21,6 @@
import android.view.MotionEvent
import android.view.View
import androidx.core.text.TextUtilsCompat
-import androidx.core.view.ViewCompat
import androidx.fragment.app.FragmentActivity
import androidx.viewpager2.integration.testapp.cards.CardViewAdapter
import androidx.viewpager2.widget.ViewPager2
@@ -34,7 +33,7 @@
private var lastValue: Float = 0f
private val isRtl = TextUtilsCompat.getLayoutDirectionFromLocale(Locale.getDefault()) ==
- ViewCompat.LAYOUT_DIRECTION_RTL
+ View.LAYOUT_DIRECTION_RTL
private val ViewPager2.isHorizontal: Boolean
get() {
diff --git a/viewpager2/viewpager2/src/androidTest/java/androidx/viewpager2/widget/AccessibilityTest.kt b/viewpager2/viewpager2/src/androidTest/java/androidx/viewpager2/widget/AccessibilityTest.kt
index df70e16..b7834d2 100644
--- a/viewpager2/viewpager2/src/androidTest/java/androidx/viewpager2/widget/AccessibilityTest.kt
+++ b/viewpager2/viewpager2/src/androidTest/java/androidx/viewpager2/widget/AccessibilityTest.kt
@@ -17,7 +17,7 @@
package androidx.viewpager2.widget
import android.os.Build
-import androidx.core.view.ViewCompat
+import android.view.accessibility.AccessibilityNodeInfo
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat
import androidx.test.filters.LargeTest
import androidx.test.platform.app.InstrumentationRegistry
@@ -79,13 +79,11 @@
val latch = viewPager.addWaitForScrolledLatch(targetPage)
runOnUiThreadSync {
if (targetPage - currentPage == 1) {
- ViewCompat.performAccessibilityAction(
- viewPager,
+ viewPager.performAccessibilityAction(
getNextPageAction(config.orientation, viewPager.isRtl), null
)
} else {
- ViewCompat.performAccessibilityAction(
- viewPager,
+ viewPager.performAccessibilityAction(
getPreviousPageAction(config.orientation, viewPager.isRtl), null
)
}
@@ -106,14 +104,15 @@
test_collectionInfo(0)
}
+ @Suppress("DEPRECATION") // AccessibilityNodeInfo.obtain()
private fun test_collectionInfo(numberOfItems: Int) {
setUpTest(config.orientation).apply {
setAdapterSync(viewAdapterProvider.provider(stringSequence(numberOfItems)))
assertBasicState(viewPager.currentItem, null)
- var node = AccessibilityNodeInfoCompat.obtain()
+ var node = AccessibilityNodeInfo.obtain()
runOnUiThreadSync {
- ViewCompat.onInitializeAccessibilityNodeInfo(viewPager, node)
+ viewPager.onInitializeAccessibilityNodeInfo(node)
}
var collectionInfo = node.collectionInfo
if (config.orientation == ORIENTATION_VERTICAL) {
@@ -130,6 +129,7 @@
}
}
+ @Suppress("DEPRECATION") // AccessibilityNodeInfo.obtain()
@Test
fun test_collectionItemInfo() {
setUpTest(config.orientation).apply {
@@ -137,10 +137,10 @@
listOf(1, 0, 2, 5).forEach { targetPage ->
viewPager.setCurrentItemSync(targetPage, false, 2, TimeUnit.SECONDS)
assertBasicState(targetPage)
- var nodeChild = AccessibilityNodeInfoCompat.obtain()
+ var nodeChild = AccessibilityNodeInfo.obtain()
val item = viewPager.linearLayoutManager.findViewByPosition(targetPage)
runOnUiThreadSync {
- ViewCompat.onInitializeAccessibilityNodeInfo(item!!, nodeChild)
+ item!!.onInitializeAccessibilityNodeInfo(nodeChild)
}
var collectionItemInfo = nodeChild.collectionItemInfo
if (config.orientation == ORIENTATION_VERTICAL) {
diff --git a/viewpager2/viewpager2/src/androidTest/java/androidx/viewpager2/widget/BaseTest.kt b/viewpager2/viewpager2/src/androidTest/java/androidx/viewpager2/widget/BaseTest.kt
index 48f23b3..9d21890 100644
--- a/viewpager2/viewpager2/src/androidTest/java/androidx/viewpager2/widget/BaseTest.kt
+++ b/viewpager2/viewpager2/src/androidTest/java/androidx/viewpager2/widget/BaseTest.kt
@@ -22,7 +22,6 @@
import android.view.View
import android.view.ViewConfiguration
import android.view.accessibility.AccessibilityNodeInfo
-import androidx.core.view.ViewCompat
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD
@@ -725,6 +724,6 @@
}
val View.isRtl: Boolean
- get() = ViewCompat.getLayoutDirection(this) == ViewCompat.LAYOUT_DIRECTION_RTL
+ get() = getLayoutDirection() == View.LAYOUT_DIRECTION_RTL
val ViewPager2.isHorizontal: Boolean get() = orientation == ORIENTATION_HORIZONTAL
diff --git a/viewpager2/viewpager2/src/androidTest/java/androidx/viewpager2/widget/FakeDragTest.kt b/viewpager2/viewpager2/src/androidTest/java/androidx/viewpager2/widget/FakeDragTest.kt
index 074d046..52960af 100644
--- a/viewpager2/viewpager2/src/androidTest/java/androidx/viewpager2/widget/FakeDragTest.kt
+++ b/viewpager2/viewpager2/src/androidTest/java/androidx/viewpager2/widget/FakeDragTest.kt
@@ -22,7 +22,6 @@
import android.view.animation.DecelerateInterpolator
import android.view.animation.Interpolator
import android.view.animation.LinearInterpolator
-import androidx.core.view.ViewCompat
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD
import androidx.core.view.animation.PathInterpolatorCompat
import androidx.test.filters.LargeTest
@@ -345,7 +344,7 @@
fun test_performA11yActionDuringFakeDrag() {
startManualDragDuringFakeDrag(.9f, 1000, interpolator = fastDecelerateInterpolator) {
test.runOnUiThreadSync {
- ViewCompat.performAccessibilityAction(test.viewPager, getNextPageAction(), null)
+ test.viewPager.performAccessibilityAction(getNextPageAction(), null)
}
}
}
diff --git a/viewpager2/viewpager2/src/androidTest/java/androidx/viewpager2/widget/HostFragmentBackStackTest.kt b/viewpager2/viewpager2/src/androidTest/java/androidx/viewpager2/widget/HostFragmentBackStackTest.kt
index 4ca8cf5..102df12 100644
--- a/viewpager2/viewpager2/src/androidTest/java/androidx/viewpager2/widget/HostFragmentBackStackTest.kt
+++ b/viewpager2/viewpager2/src/androidTest/java/androidx/viewpager2/widget/HostFragmentBackStackTest.kt
@@ -25,7 +25,6 @@
import android.view.ViewGroup.LayoutParams
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
import android.widget.FrameLayout
-import androidx.core.view.ViewCompat
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -53,7 +52,7 @@
fun test_sameFragment_multipleBackStackEntries() {
@Suppress("DEPRECATION")
FragmentManager.enableDebugLogging(true)
- val containerId = ViewCompat.generateViewId()
+ val containerId = View.generateViewId()
setUpTest(ORIENTATION_HORIZONTAL).apply {
val container: ViewGroup = FrameLayout(activity).apply {
id = containerId
diff --git a/viewpager2/viewpager2/src/main/java/androidx/viewpager2/adapter/FragmentStateAdapter.java b/viewpager2/viewpager2/src/main/java/androidx/viewpager2/adapter/FragmentStateAdapter.java
index dca3df1..a6a77bb 100644
--- a/viewpager2/viewpager2/src/main/java/androidx/viewpager2/adapter/FragmentStateAdapter.java
+++ b/viewpager2/viewpager2/src/main/java/androidx/viewpager2/adapter/FragmentStateAdapter.java
@@ -38,7 +38,6 @@
import androidx.annotation.RequiresOptIn;
import androidx.collection.ArraySet;
import androidx.collection.LongSparseArray;
-import androidx.core.view.ViewCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
@@ -187,7 +186,7 @@
/* Special case when {@link RecyclerView} decides to keep the {@link container}
* attached to the window, resulting in no {@link `onViewAttachedToWindow} callback later */
final FrameLayout container = holder.getContainer();
- if (ViewCompat.isAttachedToWindow(container)) {
+ if (container.isAttachedToWindow()) {
placeFragmentInViewHolder(holder);
}
@@ -357,7 +356,7 @@
return;
}
source.getLifecycle().removeObserver(this);
- if (ViewCompat.isAttachedToWindow(holder.getContainer())) {
+ if (holder.getContainer().isAttachedToWindow()) {
placeFragmentInViewHolder(holder);
}
}
diff --git a/viewpager2/viewpager2/src/main/java/androidx/viewpager2/adapter/FragmentViewHolder.java b/viewpager2/viewpager2/src/main/java/androidx/viewpager2/adapter/FragmentViewHolder.java
index bcb5b2d..1627a07 100644
--- a/viewpager2/viewpager2/src/main/java/androidx/viewpager2/adapter/FragmentViewHolder.java
+++ b/viewpager2/viewpager2/src/main/java/androidx/viewpager2/adapter/FragmentViewHolder.java
@@ -16,11 +16,11 @@
package androidx.viewpager2.adapter;
+import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import androidx.annotation.NonNull;
-import androidx.core.view.ViewCompat;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.RecyclerView.ViewHolder;
@@ -38,7 +38,7 @@
container.setLayoutParams(
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
- container.setId(ViewCompat.generateViewId());
+ container.setId(View.generateViewId());
container.setSaveEnabled(false);
return new FragmentViewHolder(container);
}
diff --git a/viewpager2/viewpager2/src/main/java/androidx/viewpager2/widget/ViewPager2.java b/viewpager2/viewpager2/src/main/java/androidx/viewpager2/widget/ViewPager2.java
index 54fec80..93946b2 100644
--- a/viewpager2/viewpager2/src/main/java/androidx/viewpager2/widget/ViewPager2.java
+++ b/viewpager2/viewpager2/src/main/java/androidx/viewpager2/widget/ViewPager2.java
@@ -188,7 +188,7 @@
: new BasicAccessibilityProvider();
mRecyclerView = new RecyclerViewImpl(context);
- mRecyclerView.setId(ViewCompat.generateViewId());
+ mRecyclerView.setId(View.generateViewId());
mRecyclerView.setDescendantFocusability(FOCUS_BEFORE_DESCENDANTS);
mLayoutManager = new LinearLayoutManagerImpl(context);
@@ -583,7 +583,7 @@
}
boolean isRtl() {
- return mLayoutManager.getLayoutDirection() == ViewCompat.LAYOUT_DIRECTION_RTL;
+ return mLayoutManager.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
}
/**
@@ -1370,8 +1370,7 @@
@Override
public void onInitialize(@NonNull CompositeOnPageChangeCallback pageChangeEventDispatcher,
@NonNull RecyclerView recyclerView) {
- ViewCompat.setImportantForAccessibility(recyclerView,
- ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO);
+ recyclerView.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO);
mAdapterDataObserver = new DataSetChangeObserver() {
@Override
@@ -1380,10 +1379,9 @@
}
};
- if (ViewCompat.getImportantForAccessibility(ViewPager2.this)
- == ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
- ViewCompat.setImportantForAccessibility(ViewPager2.this,
- ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES);
+ if (ViewPager2.this.getImportantForAccessibility()
+ == View.IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
+ ViewPager2.this.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
}
}
diff --git a/wear/compose/compose-foundation/build.gradle b/wear/compose/compose-foundation/build.gradle
index 5a8337c..9625da5 100644
--- a/wear/compose/compose-foundation/build.gradle
+++ b/wear/compose/compose-foundation/build.gradle
@@ -40,6 +40,7 @@
implementation(libs.kotlinStdlib)
implementation(project(":compose:foundation:foundation-layout"))
implementation(project(":compose:ui:ui-util"))
+ implementation(project(":lifecycle:lifecycle-runtime-compose"))
implementation("androidx.core:core:1.11.0")
implementation("androidx.profileinstaller:profileinstaller:1.3.0")
diff --git a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/CompositionLocals.kt b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/CompositionLocals.kt
index 03c26c6..6c6eb62 100644
--- a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/CompositionLocals.kt
+++ b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/CompositionLocals.kt
@@ -29,13 +29,13 @@
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.core.os.HandlerCompat
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
import java.util.concurrent.atomic.AtomicReference
import kotlinx.coroutines.MainScope
-import kotlinx.coroutines.channels.Channel
-import kotlinx.coroutines.channels.Channel.Factory.CONFLATED
+import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
-import kotlinx.coroutines.flow.flow
+import kotlinx.coroutines.flow.callbackFlow
import kotlinx.coroutines.flow.stateIn
/**
@@ -48,7 +48,8 @@
val LocalReduceMotion: ProvidableCompositionLocal<ReduceMotion> = staticCompositionLocalOf {
ReduceMotion {
val context = LocalContext.current.applicationContext
- getReduceMotionFlowFor(context).value
+ val flow = getReduceMotionFlowFor(context)
+ flow.collectAsStateWithLifecycle().value
}
}
@@ -85,27 +86,34 @@
private fun getReduceMotionFlowFor(applicationContext: Context): StateFlow<Boolean> {
val resolver = applicationContext.contentResolver
val reduceMotionUri = Settings.Global.getUriFor(REDUCE_MOTION)
- val channel = Channel<Unit>(CONFLATED)
- val contentObserver =
- object : ContentObserver(HandlerCompat.createAsync(Looper.getMainLooper())) {
- override fun onChange(selfChange: Boolean, uri: Uri?) {
- channel.trySend(Unit)
- }
- }
+
return reduceMotionCache.updateAndGet {
- it ?: flow {
- resolver.registerContentObserver(reduceMotionUri, false, contentObserver)
- try {
- for (value in channel) {
- val newValue = getReducedMotionSettingValue(resolver)
- emit(newValue)
+ it ?: callbackFlow {
+ val contentObserver =
+ object : ContentObserver(HandlerCompat.createAsync(Looper.getMainLooper())) {
+ override fun deliverSelfNotifications(): Boolean {
+ // Returning true to receive change notification so that
+ // the flow sends new value after it is initialized.
+ return true
+ }
+
+ override fun onChange(selfChange: Boolean, uri: Uri?) {
+ super.onChange(selfChange, uri)
+ trySend(getReducedMotionSettingValue(resolver))
+ }
}
- } finally {
+
+ resolver.registerContentObserver(reduceMotionUri, false, contentObserver)
+
+ // Force send value when flow is initialized
+ resolver.notifyChange(reduceMotionUri, contentObserver)
+
+ awaitClose {
resolver.unregisterContentObserver(contentObserver)
}
}.stateIn(
MainScope(),
- SharingStarted.WhileSubscribed(),
+ SharingStarted.WhileSubscribed(5000),
getReducedMotionSettingValue(resolver)
)
}
diff --git a/wear/compose/compose-material3/integration-tests/src/main/java/androidx/wear/compose/material3/demos/RadioButtonDemo.kt b/wear/compose/compose-material3/integration-tests/src/main/java/androidx/wear/compose/material3/demos/RadioButtonDemo.kt
index b286854..545812f 100644
--- a/wear/compose/compose-material3/integration-tests/src/main/java/androidx/wear/compose/material3/demos/RadioButtonDemo.kt
+++ b/wear/compose/compose-material3/integration-tests/src/main/java/androidx/wear/compose/material3/demos/RadioButtonDemo.kt
@@ -129,6 +129,7 @@
content: (@Composable BoxScope.() -> Unit)? = null,
) {
RadioButton(
+ modifier = Modifier.fillMaxWidth(),
icon = content,
label = {
Text(
diff --git a/wear/compose/compose-material3/integration-tests/src/main/java/androidx/wear/compose/material3/demos/SplitToggleButtonDemo.kt b/wear/compose/compose-material3/integration-tests/src/main/java/androidx/wear/compose/material3/demos/SplitToggleButtonDemo.kt
index 1079368..62e3461 100644
--- a/wear/compose/compose-material3/integration-tests/src/main/java/androidx/wear/compose/material3/demos/SplitToggleButtonDemo.kt
+++ b/wear/compose/compose-material3/integration-tests/src/main/java/androidx/wear/compose/material3/demos/SplitToggleButtonDemo.kt
@@ -154,12 +154,13 @@
var checked by remember { mutableStateOf(initiallyChecked) }
val context = LocalContext.current
SplitToggleButton(
+ modifier = Modifier.fillMaxWidth(),
label = {
Text(
"Primary label",
modifier = Modifier.fillMaxWidth(),
maxLines = 3,
- textAlign = TextAlign.Center,
+ textAlign = TextAlign.Start,
overflow = TextOverflow.Ellipsis
)
},
diff --git a/wear/compose/compose-material3/integration-tests/src/main/java/androidx/wear/compose/material3/demos/ToggleButtonDemo.kt b/wear/compose/compose-material3/integration-tests/src/main/java/androidx/wear/compose/material3/demos/ToggleButtonDemo.kt
index e8c3371..fc3460f 100644
--- a/wear/compose/compose-material3/integration-tests/src/main/java/androidx/wear/compose/material3/demos/ToggleButtonDemo.kt
+++ b/wear/compose/compose-material3/integration-tests/src/main/java/androidx/wear/compose/material3/demos/ToggleButtonDemo.kt
@@ -110,7 +110,7 @@
enabled = true,
initiallyChecked = true,
primary = "8:15AM",
- secondary = "Mon, Tue, Wed"
+ secondary = "Monday"
)
}
item {
@@ -141,6 +141,7 @@
) {
var checked by remember { mutableStateOf(initiallyChecked) }
ToggleButton(
+ modifier = Modifier.fillMaxWidth(),
label = {
Text(
primary,
@@ -173,6 +174,7 @@
private fun DemoToggleSwitch(enabled: Boolean, initiallyChecked: Boolean) {
var checked by remember { mutableStateOf(initiallyChecked) }
ToggleButton(
+ modifier = Modifier.fillMaxWidth(),
label = {
Text(
"Primary label",
diff --git a/wear/compose/integration-tests/demos/build.gradle b/wear/compose/integration-tests/demos/build.gradle
index 64ad508..24f6946 100644
--- a/wear/compose/integration-tests/demos/build.gradle
+++ b/wear/compose/integration-tests/demos/build.gradle
@@ -69,6 +69,9 @@
androidTestImplementation(project(":activity:activity-compose"))
androidTestImplementation(project(":activity:activity-ktx"))
androidTestImplementation(project(":compose:ui:ui-test-junit4"))
+ androidTestImplementation(project(":lifecycle:lifecycle-runtime"))
+ androidTestImplementation(project(":lifecycle:lifecycle-common"))
+ androidTestImplementation(project(":lifecycle:lifecycle-runtime-ktx"))
androidTestImplementation(libs.testCore)
androidTestImplementation(libs.testRules)
androidTestImplementation(libs.testRunner)
diff --git a/wear/compose/integration-tests/navigation/build.gradle b/wear/compose/integration-tests/navigation/build.gradle
index 065c152..dc4e776 100644
--- a/wear/compose/integration-tests/navigation/build.gradle
+++ b/wear/compose/integration-tests/navigation/build.gradle
@@ -52,12 +52,8 @@
implementation(project(":wear:compose:compose-foundation-samples"))
implementation(project(":wear:compose:compose-material-samples"))
implementation(project(':wear:compose:compose-navigation'))
- // old version of common-java8 conflicts with newer version, because both have
- // DefaultLifecycleEventObserver.
- // Outside of androidx this is resolved via constraint added to lifecycle-common,
- // but it doesn't work in androidx.
- // See aosp/1804059
- androidTestImplementation "androidx.lifecycle:lifecycle-common-java8:2.4.0"
+
+ androidTestImplementation(project(":lifecycle:lifecycle-common"))
// Uses project dependency to match collections/compose-runtime
androidTestImplementation api("androidx.annotation:annotation:1.7.0")
}
\ No newline at end of file
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/InteractiveInstanceManager.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/InteractiveInstanceManager.kt
index 9381afd..2952487 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/InteractiveInstanceManager.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/InteractiveInstanceManager.kt
@@ -16,6 +16,7 @@
package androidx.wear.watchface.control
+import android.os.Build
import android.util.Log
import androidx.annotation.UiThread
import androidx.annotation.VisibleForTesting
@@ -198,7 +199,10 @@
val engine = impl.engine!!
engine.setUserStyle(value.params.userStyle)
- if (engine.resourceOnlyWatchFacePackageName !=
+ // Note prior to android U, auxiliaryComponentPackageName may be non null for regular
+ // watch faces.
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE &&
+ engine.resourceOnlyWatchFacePackageName !=
value.params.auxiliaryComponentPackageName
) {
val message =
diff --git a/wear/wear/src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java b/wear/wear/src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java
index dd5e729..0c9b641 100644
--- a/wear/wear/src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java
+++ b/wear/wear/src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java
@@ -40,7 +40,6 @@
import androidx.annotation.VisibleForTesting;
import androidx.core.view.NestedScrollingParent;
import androidx.core.view.NestedScrollingParentHelper;
-import androidx.core.view.ViewCompat;
import androidx.customview.widget.ViewDragHelper;
import androidx.wear.widget.drawer.FlingWatcherFactory.FlingListener;
import androidx.wear.widget.drawer.FlingWatcherFactory.FlingWatcher;
@@ -532,7 +531,7 @@
final boolean bottomSettling = mBottomDrawerDragger.continueSettling(true /*
deferCallbacks */);
if (topSettling || bottomSettling) {
- ViewCompat.postInvalidateOnAnimation(this);
+ postInvalidateOnAnimation();
}
}
diff --git a/work/work-runtime/src/main/java/androidx/work/Data_.kt b/work/work-runtime/src/main/java/androidx/work/Data_.kt
index 4487d0d..b698bbc 100644
--- a/work/work-runtime/src/main/java/androidx/work/Data_.kt
+++ b/work/work-runtime/src/main/java/androidx/work/Data_.kt
@@ -21,9 +21,12 @@
import androidx.room.TypeConverter
import java.io.ByteArrayInputStream
import java.io.ByteArrayOutputStream
+import java.io.DataInputStream
+import java.io.DataOutputStream
import java.io.IOException
import java.io.ObjectInputStream
import java.io.ObjectOutputStream
+import java.io.ObjectStreamConstants
import java.util.Collections
import java.util.Objects
@@ -202,7 +205,7 @@
* @throws IllegalStateException if the serialized payload is bigger than
* [.MAX_DATA_BYTES]
*/
- fun toByteArray(): ByteArray = toByteArrayInternal(this)
+ fun toByteArray(): ByteArray = toByteArrayInternalV1(this)
/**
* Returns `true` if the instance of [Data] has a non-null value corresponding to
@@ -512,7 +515,7 @@
val data = Data(values)
// Make sure we catch Data objects that are too large at build() instead of later. This
// method will throw an exception if data is too big.
- toByteArrayInternal(data)
+ toByteArrayInternalV1(data)
return data
}
}
@@ -532,6 +535,40 @@
const val MAX_DATA_BYTES = 10 * 1024 // 10KB
/**
+ * The list of supported types.
+ */
+ private const val TYPE_NULL: Byte = 0
+ private const val TYPE_BOOLEAN: Byte = 1
+ private const val TYPE_BYTE: Byte = 2
+ private const val TYPE_INTEGER: Byte = 3
+ private const val TYPE_LONG: Byte = 4
+ private const val TYPE_FLOAT: Byte = 5
+ private const val TYPE_DOUBLE: Byte = 6
+ private const val TYPE_STRING: Byte = 7
+ private const val TYPE_BOOLEAN_ARRAY: Byte = 8
+ private const val TYPE_BYTE_ARRAY: Byte = 9
+ private const val TYPE_INTEGER_ARRAY: Byte = 10
+ private const val TYPE_LONG_ARRAY: Byte = 11
+ private const val TYPE_FLOAT_ARRAY: Byte = 12
+ private const val TYPE_DOUBLE_ARRAY: Byte = 13
+ private const val TYPE_STRING_ARRAY: Byte = 14
+
+ /**
+ * Denotes `null` in a String array.
+ */
+ private const val NULL_STRING_V1 = "androidx.work.Data-95ed6082-b8e9-46e8-a73f-ff56f00f5d9d"
+
+ /**
+ * Magic number used in stream header.
+ */
+ private const val STREAM_MAGIC: Short = 0xabef.toShort()
+
+ /**
+ * Version number used in stream header.
+ */
+ private const val STREAM_VERSION: Short = 1
+
+ /**
* Converts [Data] to a byte array for persistent storage.
*
* @param data The [Data] object to convert
@@ -541,8 +578,11 @@
*/
@JvmStatic
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
- @TypeConverter
- fun toByteArrayInternal(data: Data): ByteArray {
+ @Deprecated(
+ message = "This is kept for testing migration",
+ replaceWith = ReplaceWith("toByteArrayInternalV1")
+ )
+ fun toByteArrayInternalV0(data: Data): ByteArray {
return try {
val stream = ByteArrayOutputStream().use { outputStream ->
ObjectOutputStream(outputStream).use { objectOutputStream ->
@@ -566,6 +606,115 @@
}
}
+ @JvmStatic
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @TypeConverter
+ fun toByteArrayInternalV1(data: Data): ByteArray {
+ fun DataOutputStream.writeHeader() {
+ // We use our own magic and it's different from the
+ // `ObjectStreamConstants.STREAM_MAGIC` used in V0.
+ writeShort(STREAM_MAGIC.toInt())
+ writeShort(STREAM_VERSION.toInt())
+ }
+
+ fun DataOutputStream.writeArray(array: Array<*>) {
+ val type = when (array::class) {
+ Array<Boolean>::class -> TYPE_BOOLEAN_ARRAY
+ Array<Byte>::class -> TYPE_BYTE_ARRAY
+ Array<Int>::class -> TYPE_INTEGER_ARRAY
+ Array<Long>::class -> TYPE_LONG_ARRAY
+ Array<Float>::class -> TYPE_FLOAT_ARRAY
+ Array<Double>::class -> TYPE_DOUBLE_ARRAY
+ Array<String>::class -> TYPE_STRING_ARRAY
+ else -> {
+ throw IllegalArgumentException(
+ "Unsupported value type ${array::class.qualifiedName}")
+ }
+ }
+ writeByte(type.toInt())
+ writeInt(array.size)
+ for (element in array) {
+ when (type) {
+ TYPE_BOOLEAN_ARRAY -> writeBoolean(element as? Boolean ?: false)
+ TYPE_BYTE_ARRAY -> writeByte((element as? Byte)?.toInt() ?: 0)
+ TYPE_INTEGER_ARRAY -> writeInt(element as? Int ?: 0)
+ TYPE_LONG_ARRAY -> writeLong(element as? Long ?: 0L)
+ TYPE_FLOAT_ARRAY -> writeFloat(element as? Float ?: 0f)
+ TYPE_DOUBLE_ARRAY -> writeDouble(element as? Double ?: 0.0)
+ TYPE_STRING_ARRAY -> writeUTF(element as? String ?: NULL_STRING_V1)
+ }
+ }
+ }
+
+ fun DataOutputStream.writeEntry(key: String, value: Any?) {
+ // type + value
+ when (value) {
+ null ->
+ writeByte(TYPE_NULL.toInt())
+ is Boolean -> {
+ writeByte(TYPE_BOOLEAN.toInt())
+ writeBoolean(value)
+ }
+ is Byte -> {
+ writeByte(TYPE_BYTE.toInt())
+ writeByte(value.toInt())
+ }
+ is Int -> {
+ writeByte(TYPE_INTEGER.toInt())
+ writeInt(value)
+ }
+ is Long -> {
+ writeByte(TYPE_LONG.toInt())
+ writeLong(value)
+ }
+ is Float -> {
+ writeByte(TYPE_FLOAT.toInt())
+ writeFloat(value)
+ }
+ is Double -> {
+ writeByte(TYPE_DOUBLE.toInt())
+ writeDouble(value)
+ }
+ is String -> {
+ writeByte(TYPE_STRING.toInt())
+ writeUTF(value)
+ }
+ is Array<*> -> {
+ writeArray(value)
+ }
+ else -> {
+ // Exhaustive check
+ throw IllegalArgumentException(
+ "Unsupported value type ${value::class.simpleName}")
+ }
+ }
+ // key
+ writeUTF(key)
+ }
+
+ return try {
+ ByteArrayOutputStream().let { outputStream ->
+ DataOutputStream(outputStream).use {
+ it.apply {
+ writeHeader()
+ writeInt(data.size())
+ for ((key, value) in data.values) {
+ writeEntry(key, value)
+ }
+ flush()
+ }
+ check(it.size() <= MAX_DATA_BYTES) {
+ "Data cannot occupy more than $MAX_DATA_BYTES bytes when serialized"
+ }
+ outputStream.toByteArray()
+ }
+ }
+ } catch (e: IOException) {
+ loge(TAG, e) { "Error in Data#toByteArray: " }
+ ByteArray(0)
+ }
+ }
+
/**
* Converts a byte array to [Data].
*
@@ -576,6 +725,84 @@
@JvmStatic
@TypeConverter
fun fromByteArray(bytes: ByteArray): Data {
+ fun ByteArrayInputStream.isObjectStream(): Boolean {
+ val header = ByteArray(2)
+ read(header)
+ val magic = ObjectStreamConstants.STREAM_MAGIC.toInt()
+ val magicLow = magic.toByte()
+ val magicHigh = (magic ushr 8).toByte()
+ val result = (header[0] == magicHigh) && (header[1] == magicLow)
+ reset()
+ return result
+ }
+ fun DataInputStream.readHeader() {
+ readShort().let { magic ->
+ check(magic == STREAM_MAGIC) {
+ "Magic number doesn't match: $magic"
+ }
+ }
+ readShort().let { version ->
+ check(version == STREAM_VERSION) {
+ "Unsupported version number: $version"
+ }
+ }
+ }
+ fun DataInputStream.readValue(type: Byte): Any? {
+ return when (type) {
+ TYPE_NULL -> null
+ TYPE_BOOLEAN -> readBoolean()
+ TYPE_BYTE -> readByte()
+ TYPE_INTEGER -> readInt()
+ TYPE_LONG -> readLong()
+ TYPE_FLOAT -> readFloat()
+ TYPE_DOUBLE -> readDouble()
+ TYPE_STRING -> readUTF()
+ TYPE_BOOLEAN_ARRAY -> {
+ Array(readInt()) {
+ readBoolean()
+ }
+ }
+ TYPE_BYTE_ARRAY -> {
+ Array(readInt()) {
+ readByte()
+ }
+ }
+ TYPE_INTEGER_ARRAY -> {
+ Array(readInt()) {
+ readInt()
+ }
+ }
+ TYPE_LONG_ARRAY -> {
+ Array(readInt()) {
+ readLong()
+ }
+ }
+ TYPE_FLOAT_ARRAY -> {
+ Array(readInt()) {
+ readFloat()
+ }
+ }
+ TYPE_DOUBLE_ARRAY -> {
+ Array(readInt()) {
+ readDouble()
+ }
+ }
+ TYPE_STRING_ARRAY -> {
+ Array(readInt()) {
+ readUTF().let {
+ if (it == NULL_STRING_V1) {
+ null
+ } else {
+ it
+ }
+ }
+ }
+ }
+ else -> {
+ throw IllegalStateException("Unsupported type $type");
+ }
+ }
+ }
check(bytes.size <= MAX_DATA_BYTES) {
"Data cannot occupy more than $MAX_DATA_BYTES bytes when serialized"
}
@@ -583,10 +810,26 @@
val map = mutableMapOf<String, Any?>()
try {
- ByteArrayInputStream(bytes).use { inputStream ->
- ObjectInputStream(inputStream).use { objectInputStream ->
- repeat(objectInputStream.readInt()) {
- map[objectInputStream.readUTF()] = objectInputStream.readObject()
+ ByteArrayInputStream(bytes).let { inputStream ->
+ if (inputStream.isObjectStream()) { // V0
+ ObjectInputStream(inputStream).use {
+ it.apply {
+ repeat(readInt()) {
+ map[readUTF()] = readObject()
+ }
+ }
+ }
+ } else { // V1
+ DataInputStream(inputStream).use {
+ it.apply {
+ readHeader()
+ repeat(readInt()) {
+ val type = readByte()
+ val value = readValue(type)
+ val key = readUTF()
+ map[key] = value
+ }
+ }
}
}
}
diff --git a/work/work-runtime/src/test/java/androidx/work/DataTest.java b/work/work-runtime/src/test/java/androidx/work/DataTest.java
index e6d117a..ff8736d 100644
--- a/work/work-runtime/src/test/java/androidx/work/DataTest.java
+++ b/work/work-runtime/src/test/java/androidx/work/DataTest.java
@@ -80,7 +80,7 @@
.putIntArray(KEY2, expectedValue2)
.build();
- byte[] byteArray = Data.toByteArrayInternal(data);
+ byte[] byteArray = Data.toByteArrayInternalV1(data);
Data restoredData = Data.fromByteArray(byteArray);
assertThat(restoredData, is(notNullValue()));
@@ -90,6 +90,14 @@
}
@Test
+ @SuppressWarnings("deprecation")
+ public void testSerializeMigration() {
+ Data data = createData();
+ Data restored = Data.fromByteArray(Data.toByteArrayInternalV0(data));
+ assertThat(restored, is(data));
+ }
+
+ @Test
public void testSerializePastMaxSize() {
int[] payload = new int[Data.MAX_DATA_BYTES + 1];
boolean caughtIllegalStateException = false;
@@ -234,12 +242,20 @@
@NonNull
private Data createData() {
Map<String, Object> map = new HashMap<>();
+ map.put("boolean", true);
map.put("byte", (byte) 1);
map.put("int", 1);
+ map.put("long", 99L);
map.put("float", 99f);
+ map.put("double", 99d);
map.put("String", "two");
+ map.put("boolean array", new boolean[] { false, true, false });
map.put("byte array", new byte[] { 1, 2, 3 });
+ map.put("int array", new long[] { 1, 2, 3 });
map.put("long array", new long[] { 1L, 2L, 3L });
+ map.put("float array", new float[] { 1f, 2f, 3f });
+ map.put("double array", new double[] { 1d, 2d, 3d });
+ map.put("string array", new String[] { "one", "two", "three", null, "" });
map.put("null", null);
Data.Builder dataBuilder = new Data.Builder();
dataBuilder.putAll(map);