Fixed
Status Update
Comments
ki...@google.com <ki...@google.com> #2
Project: platform/frameworks/support
Branch: androidx-master-dev
commit c60f33e229e31ab328ef6b59dab63b264954831c
Author: Alexandre Elias <aelias@google.com>
Date: Fri Jul 10 16:23:09 2020
Semantics no-op cleanups
Partly in response to lmr's broad code review, I did a pass of
superficial API/implementation cleanup. The main changes are:
- I changed each Boolean SemanticsProperty where false is equivalent to
not being present to take "Unit" instead. This is conceptually
clearer: it avoids questions like "can I cancel out a semantics from a
merged child by setting it to false?" Because "property = Unit" looks
weird, I also changed the style of these to "property()".
- I moved the Semantics id generator closer to where it's used, in
SemanticsModifierCore. I made it internal and an AtomicInt.
(Note that integer ids are heavily used in the Android
AccessibilityNodeInfo APIs so I can't simply remove them entirely.)
- I deleted dead code. Some examples include SemanticsHintOverrides,
a public API not connected to anything, and SemanticsPropertyKey
merge() open method which is never called. (In both cases I have
a different plan in mind for accessibility.)
Fixes: 145951226
Fixes: 145955412
Test: existing tests
Relnote: "Single-value semantics properties now use a calling style.
For example, 'semantics { hidden = true }' is now written as:
'semantics { hidden() }'."
Change-Id: Ic1afd12ea22c926babc9662f1804d80b33aa0cfc
M ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/LayoutNodeModifierBenchmark.kt
M ui/ui-core/api/0.1.0-dev15.txt
M ui/ui-core/api/current.txt
M ui/ui-core/api/public_plus_experimental_0.1.0-dev15.txt
M ui/ui-core/api/public_plus_experimental_current.txt
M ui/ui-core/api/restricted_0.1.0-dev15.txt
M ui/ui-core/api/restricted_current.txt
M ui/ui-core/src/androidAndroidTest/kotlin/androidx/ui/graphics/vector/VectorTest.kt
M ui/ui-core/src/androidAndroidTest/kotlin/androidx/ui/semantics/SemanticsTests.kt
M ui/ui-core/src/androidMain/kotlin/androidx/ui/core/AndroidActuals.kt
M ui/ui-core/src/androidMain/kotlin/androidx/ui/core/AndroidComposeView.kt
M ui/ui-core/src/androidMain/kotlin/androidx/ui/core/AndroidComposeViewAccessibilityDelegateCompat.kt
M ui/ui-core/src/androidMain/kotlin/androidx/ui/core/AndroidPopup.kt
M ui/ui-core/src/commonMain/kotlin/androidx/ui/core/Expect.kt
M ui/ui-core/src/commonMain/kotlin/androidx/ui/core/semantics/SemanticsConfiguration.kt
D ui/ui-core/src/commonMain/kotlin/androidx/ui/core/semantics/SemanticsHintOverrides.kt
M ui/ui-core/src/commonMain/kotlin/androidx/ui/core/semantics/SemanticsModifier.kt
M ui/ui-core/src/commonMain/kotlin/androidx/ui/core/semantics/SemanticsNode.kt
M ui/ui-core/src/commonMain/kotlin/androidx/ui/core/semantics/SemanticsOwner.kt
M ui/ui-core/src/commonMain/kotlin/androidx/ui/core/semantics/SemanticsWrapper.kt
M ui/ui-core/src/commonMain/kotlin/androidx/ui/semantics/SemanticsProperties.kt
M ui/ui-foundation/api/0.1.0-dev15.txt
M ui/ui-foundation/api/current.txt
M ui/ui-foundation/api/public_plus_experimental_0.1.0-dev15.txt
M ui/ui-foundation/api/public_plus_experimental_current.txt
M ui/ui-foundation/api/restricted_0.1.0-dev15.txt
M ui/ui-foundation/api/restricted_current.txt
M ui/ui-foundation/src/main/java/androidx/ui/foundation/Clickable.kt
M ui/ui-foundation/src/main/java/androidx/ui/foundation/Dialog.kt
M ui/ui-foundation/src/main/java/androidx/ui/foundation/Scroller.kt
M ui/ui-foundation/src/main/java/androidx/ui/foundation/selection/Selectable.kt
M ui/ui-foundation/src/main/java/androidx/ui/foundation/selection/Toggleable.kt
M ui/ui-foundation/src/main/java/androidx/ui/foundation/semantics/FoundationSemanticsProperties.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/ButtonTest.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/CardTest.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/CheckboxScreenshotTest.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/RadioButtonScreenshotTest.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/ScaffoldTest.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/SnackbarTest.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/SurfaceTest.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/ripple/RippleIndicationTest.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/textfield/TextFieldScreenshotTest.kt
M ui/ui-material/src/main/java/androidx/ui/material/AppBar.kt
M ui/ui-material/src/main/java/androidx/ui/material/TextFieldImpl.kt
M ui/ui-test/src/androidTest/java/androidx/ui/test/AssertsTest.kt
M ui/ui-test/src/androidTest/java/androidx/ui/test/CallSemanticsActionTest.kt
M ui/ui-test/src/androidTest/java/androidx/ui/test/ErrorMessagesTest.kt
M ui/ui-test/src/androidTest/java/androidx/ui/test/FindersTest.kt
M ui/ui-test/src/androidTest/java/androidx/ui/test/PrintToStringTest.kt
M ui/ui-test/src/androidTest/java/androidx/ui/test/ScrollToTest.kt
M ui/ui-test/src/androidTest/java/androidx/ui/test/TextActionsTest.kt
M ui/ui-test/src/main/java/androidx/ui/test/Actions.kt
M ui/ui-test/src/main/java/androidx/ui/test/Filters.kt
M ui/ui-text/api/0.1.0-dev15.txt
M ui/ui-text/api/current.txt
M ui/ui-text/api/public_plus_experimental_0.1.0-dev15.txt
M ui/ui-text/api/public_plus_experimental_current.txt
M ui/ui-text/api/restricted_0.1.0-dev15.txt
M ui/ui-text/api/restricted_current.txt
M ui/ui-text/src/commonMain/kotlin/androidx/ui/text/CoreTextField.kt
M ui/ui-text/src/commonMain/kotlin/androidx/ui/text/TextSemanticsProperties.kt
https://android-review.googlesource.com/1360099
Branch: androidx-master-dev
commit c60f33e229e31ab328ef6b59dab63b264954831c
Author: Alexandre Elias <aelias@google.com>
Date: Fri Jul 10 16:23:09 2020
Semantics no-op cleanups
Partly in response to lmr's broad code review, I did a pass of
superficial API/implementation cleanup. The main changes are:
- I changed each Boolean SemanticsProperty where false is equivalent to
not being present to take "Unit" instead. This is conceptually
clearer: it avoids questions like "can I cancel out a semantics from a
merged child by setting it to false?" Because "property = Unit" looks
weird, I also changed the style of these to "property()".
- I moved the Semantics id generator closer to where it's used, in
SemanticsModifierCore. I made it internal and an AtomicInt.
(Note that integer ids are heavily used in the Android
AccessibilityNodeInfo APIs so I can't simply remove them entirely.)
- I deleted dead code. Some examples include SemanticsHintOverrides,
a public API not connected to anything, and SemanticsPropertyKey
merge() open method which is never called. (In both cases I have
a different plan in mind for accessibility.)
Fixes: 145951226
Fixes: 145955412
Test: existing tests
Relnote: "Single-value semantics properties now use a calling style.
For example, 'semantics { hidden = true }' is now written as:
'semantics { hidden() }'."
Change-Id: Ic1afd12ea22c926babc9662f1804d80b33aa0cfc
M ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/LayoutNodeModifierBenchmark.kt
M ui/ui-core/api/0.1.0-dev15.txt
M ui/ui-core/api/current.txt
M ui/ui-core/api/public_plus_experimental_0.1.0-dev15.txt
M ui/ui-core/api/public_plus_experimental_current.txt
M ui/ui-core/api/restricted_0.1.0-dev15.txt
M ui/ui-core/api/restricted_current.txt
M ui/ui-core/src/androidAndroidTest/kotlin/androidx/ui/graphics/vector/VectorTest.kt
M ui/ui-core/src/androidAndroidTest/kotlin/androidx/ui/semantics/SemanticsTests.kt
M ui/ui-core/src/androidMain/kotlin/androidx/ui/core/AndroidActuals.kt
M ui/ui-core/src/androidMain/kotlin/androidx/ui/core/AndroidComposeView.kt
M ui/ui-core/src/androidMain/kotlin/androidx/ui/core/AndroidComposeViewAccessibilityDelegateCompat.kt
M ui/ui-core/src/androidMain/kotlin/androidx/ui/core/AndroidPopup.kt
M ui/ui-core/src/commonMain/kotlin/androidx/ui/core/Expect.kt
M ui/ui-core/src/commonMain/kotlin/androidx/ui/core/semantics/SemanticsConfiguration.kt
D ui/ui-core/src/commonMain/kotlin/androidx/ui/core/semantics/SemanticsHintOverrides.kt
M ui/ui-core/src/commonMain/kotlin/androidx/ui/core/semantics/SemanticsModifier.kt
M ui/ui-core/src/commonMain/kotlin/androidx/ui/core/semantics/SemanticsNode.kt
M ui/ui-core/src/commonMain/kotlin/androidx/ui/core/semantics/SemanticsOwner.kt
M ui/ui-core/src/commonMain/kotlin/androidx/ui/core/semantics/SemanticsWrapper.kt
M ui/ui-core/src/commonMain/kotlin/androidx/ui/semantics/SemanticsProperties.kt
M ui/ui-foundation/api/0.1.0-dev15.txt
M ui/ui-foundation/api/current.txt
M ui/ui-foundation/api/public_plus_experimental_0.1.0-dev15.txt
M ui/ui-foundation/api/public_plus_experimental_current.txt
M ui/ui-foundation/api/restricted_0.1.0-dev15.txt
M ui/ui-foundation/api/restricted_current.txt
M ui/ui-foundation/src/main/java/androidx/ui/foundation/Clickable.kt
M ui/ui-foundation/src/main/java/androidx/ui/foundation/Dialog.kt
M ui/ui-foundation/src/main/java/androidx/ui/foundation/Scroller.kt
M ui/ui-foundation/src/main/java/androidx/ui/foundation/selection/Selectable.kt
M ui/ui-foundation/src/main/java/androidx/ui/foundation/selection/Toggleable.kt
M ui/ui-foundation/src/main/java/androidx/ui/foundation/semantics/FoundationSemanticsProperties.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/ButtonTest.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/CardTest.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/CheckboxScreenshotTest.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/RadioButtonScreenshotTest.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/ScaffoldTest.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/SnackbarTest.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/SurfaceTest.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/ripple/RippleIndicationTest.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/textfield/TextFieldScreenshotTest.kt
M ui/ui-material/src/main/java/androidx/ui/material/AppBar.kt
M ui/ui-material/src/main/java/androidx/ui/material/TextFieldImpl.kt
M ui/ui-test/src/androidTest/java/androidx/ui/test/AssertsTest.kt
M ui/ui-test/src/androidTest/java/androidx/ui/test/CallSemanticsActionTest.kt
M ui/ui-test/src/androidTest/java/androidx/ui/test/ErrorMessagesTest.kt
M ui/ui-test/src/androidTest/java/androidx/ui/test/FindersTest.kt
M ui/ui-test/src/androidTest/java/androidx/ui/test/PrintToStringTest.kt
M ui/ui-test/src/androidTest/java/androidx/ui/test/ScrollToTest.kt
M ui/ui-test/src/androidTest/java/androidx/ui/test/TextActionsTest.kt
M ui/ui-test/src/main/java/androidx/ui/test/Actions.kt
M ui/ui-test/src/main/java/androidx/ui/test/Filters.kt
M ui/ui-text/api/0.1.0-dev15.txt
M ui/ui-text/api/current.txt
M ui/ui-text/api/public_plus_experimental_0.1.0-dev15.txt
M ui/ui-text/api/public_plus_experimental_current.txt
M ui/ui-text/api/restricted_0.1.0-dev15.txt
M ui/ui-text/api/restricted_current.txt
M ui/ui-text/src/commonMain/kotlin/androidx/ui/text/CoreTextField.kt
M ui/ui-text/src/commonMain/kotlin/androidx/ui/text/TextSemanticsProperties.kt
ap...@google.com <ap...@google.com> #3
Project: platform/frameworks/support
Branch: androidx-master-dev
commit 6aab78e2ef9377b16663d979a87083d139856806
Author: Ian Lake <ilake@google.com>
Date: Mon Apr 13 13:15:05 2020
Add @NonNull annotations to internal menu callbacks
Window.Callback was recently to changed to only
take non-null menus / menu items. This updates the
internal AppCompat MenuBuilder.Callback and
MenuPresenter.Callback to add the same @NonNull
annotations.
Test: new BaseBasicsTestCase tests pass
BUG: 142843126
Change-Id: I1fc695406d486d86fe0aa7c3387057b8b3a9160e
M appcompat/appcompat/api/restricted_1.2.0-beta01.txt
M appcompat/appcompat/api/restricted_current.txt
M appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/BaseBasicsTestCase.java
M appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
M appcompat/appcompat/src/main/java/androidx/appcompat/app/ToolbarActionBar.java
M appcompat/appcompat/src/main/java/androidx/appcompat/app/WindowDecorActionBar.java
M appcompat/appcompat/src/main/java/androidx/appcompat/view/StandaloneActionMode.java
M appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java
M appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuBuilder.java
M appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuDialogHelper.java
M appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuPresenter.java
M appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/SubMenuBuilder.java
M appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionMenuPresenter.java
M appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionMenuView.java
M appcompat/appcompat/src/main/java/androidx/appcompat/widget/PopupMenu.java
https://android-review.googlesource.com/1284518
Branch: androidx-master-dev
commit 6aab78e2ef9377b16663d979a87083d139856806
Author: Ian Lake <ilake@google.com>
Date: Mon Apr 13 13:15:05 2020
Add @NonNull annotations to internal menu callbacks
Window.Callback was recently to changed to only
take non-null menus / menu items. This updates the
internal AppCompat MenuBuilder.Callback and
MenuPresenter.Callback to add the same @NonNull
annotations.
Test: new BaseBasicsTestCase tests pass
BUG: 142843126
Change-Id: I1fc695406d486d86fe0aa7c3387057b8b3a9160e
M appcompat/appcompat/api/restricted_1.2.0-beta01.txt
M appcompat/appcompat/api/restricted_current.txt
M appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/BaseBasicsTestCase.java
M appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
M appcompat/appcompat/src/main/java/androidx/appcompat/app/ToolbarActionBar.java
M appcompat/appcompat/src/main/java/androidx/appcompat/app/WindowDecorActionBar.java
M appcompat/appcompat/src/main/java/androidx/appcompat/view/StandaloneActionMode.java
M appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java
M appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuBuilder.java
M appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuDialogHelper.java
M appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuPresenter.java
M appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/SubMenuBuilder.java
M appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionMenuPresenter.java
M appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionMenuView.java
M appcompat/appcompat/src/main/java/androidx/appcompat/widget/PopupMenu.java
il...@google.com <il...@google.com> #4
We've updated AppCompat to no longer pass a null Menu. This will be available in a future 1.2.0 release.
ap...@google.com <ap...@google.com> #5
Project: platform/frameworks/support
Branch: androidx-main
commit 10990f668a04e5eb532cd173f44562d80eae06e2
Author: Jeremy Woods <jbwoods@google.com>
Date: Wed Jun 22 16:26:37 2022
Restrict devices for ComponentActivity menu tests
Prior to SDK 26, it was possible to pass null menus to Activity menu
APIs. b/142843126 added nullability annotations to framework Activity
that ensured that any menu passed to the menu APIs were non-null.
LeakCanary was implemented in Kotlin with the expectations that the new
framework Activity nullability contracts would hold true. In reality
that is not the case, and on API levels 25 and lower, you can get a
non-null menu passed to a framework API.
There is nothing we can do to address this in the framework. The only
way to run into this issue is by using ActionBar with ComponentActivity
and attempting to use a null menu. Any devs interacting with ActionBar
should be using AppCompantActivity which addresses this issue.
Otherwise, they should be using ToolBar, which also addresses this.
We are going to move these particular test to only run on API 26 and
above to avoid these failures.
Test: updated tests
Fixes: 236868265
Fixes: 229013665
Change-Id: Ib4f606d4a1533bf9b56bd3346c0b5772d5e3cf47
M activity/activity/src/androidTest/java/androidx/activity/ComponentActivityMenuTest.kt
https://android-review.googlesource.com/2134516
Branch: androidx-main
commit 10990f668a04e5eb532cd173f44562d80eae06e2
Author: Jeremy Woods <jbwoods@google.com>
Date: Wed Jun 22 16:26:37 2022
Restrict devices for ComponentActivity menu tests
Prior to SDK 26, it was possible to pass null menus to Activity menu
APIs.
that ensured that any menu passed to the menu APIs were non-null.
LeakCanary was implemented in Kotlin with the expectations that the new
framework Activity nullability contracts would hold true. In reality
that is not the case, and on API levels 25 and lower, you can get a
non-null menu passed to a framework API.
There is nothing we can do to address this in the framework. The only
way to run into this issue is by using ActionBar with ComponentActivity
and attempting to use a null menu. Any devs interacting with ActionBar
should be using AppCompantActivity which addresses this issue.
Otherwise, they should be using ToolBar, which also addresses this.
We are going to move these particular test to only run on API 26 and
above to avoid these failures.
Test: updated tests
Fixes: 236868265
Fixes: 229013665
Change-Id: Ib4f606d4a1533bf9b56bd3346c0b5772d5e3cf47
M activity/activity/src/androidTest/java/androidx/activity/ComponentActivityMenuTest.kt
Description
1. Add a menu to the activity
2. Override the onMenuOpened callback
3. Tap the overflow menu
Notice that callback was invoked with the null menu, despite the signature having a NonNull annotation
Kotlin apps might get a crash if they treated the platform type as non-null or a type-mismatch warning if the menu argument is declared as nullable and super.onMenuOpened is invoked.
10-17 10:37:16.152 E/AndroidRuntime( 843): Process: some.package, PID: 843
10-17 10:37:16.152 E/AndroidRuntime( 843): java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter menu
10-17 10:37:16.152 E/AndroidRuntime( 843): at some.activity.onMenuOpened(Unknown Source:2)
10-17 10:37:16.152 E/AndroidRuntime( 843): at androidx.appcompat.view.WindowCallbackWrapper.onMenuOpened(WindowCallbackWrapper.java:104)
10-17 10:37:16.152 E/AndroidRuntime( 843): at androidx.appcompat.app.AppCompatDelegateImpl$AppCompatWindowCallback.onMenuOpened(AppCompatDelegateImpl.java:2868)
10-17 10:37:16.152 E/AndroidRuntime( 843): at androidx.appcompat.view.WindowCallbackWrapper.onMenuOpened(WindowCallbackWrapper.java:104)
10-17 10:37:16.152 E/AndroidRuntime( 843): at androidx.appcompat.app.ToolbarActionBar$ActionMenuPresenterCallback.onOpenSubMenu(ToolbarActionBar.java:560)
10-17 10:37:16.152 E/AndroidRuntime( 843): at androidx.appcompat.view.menu.BaseMenuPresenter.onSubMenuSelected(BaseMenuPresenter.java:221)
10-17 10:37:16.152 E/AndroidRuntime( 843): at androidx.appcompat.widget.ActionMenuPresenter.showOverflowMenu(ActionMenuPresenter.java:345)
10-17 10:37:16.152 E/AndroidRuntime( 843): at androidx.appcompat.widget.ActionMenuPresenter$OverflowMenuButton.performClick(ActionMenuPresenter.java:681)
10-17 10:37:16.152 E/AndroidRuntime( 843): at android.view.View.performClickInternal(View.java:6574)
10-17 10:37:16.152 E/AndroidRuntime( 843): at android.view.View.access$3100(View.java:778)
10-17 10:37:16.152 E/AndroidRuntime( 843): at android.view.View$PerformClick.run(View.java:25885)
10-17 10:37:16.152 E/AndroidRuntime( 843): at android.os.Handler.handleCallback(Handler.java:873)
10-17 10:37:16.152 E/AndroidRuntime( 843): at android.os.Handler.dispatchMessage(Handler.java:99)
10-17 10:37:16.152 E/AndroidRuntime( 843): at android.os.Looper.loop(Looper.java:193)
10-17 10:37:16.152 E/AndroidRuntime( 843): at android.app.ActivityThread.main(ActivityThread.java:6669)
10-17 10:37:16.152 E/AndroidRuntime( 843): at java.lang.reflect.Method.invoke(Native Method)
10-17 10:37:16.152 E/AndroidRuntime( 843): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
10-17 10:37:16.152 E/AndroidRuntime( 843): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Upon investigation it appears the ActionMenuPresenter invokes the callback with the null menu to indicate that the menu is opening:
// ActionMenuPresenter uses null as a callback argument here
// to indicate overflow is opening.
super.onSubMenuSelected(null);