summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AconfigFlags.bp6
-rw-r--r--core/java/android/content/pm/flags.aconfig8
-rw-r--r--core/java/android/hardware/radio/RadioAlert.aidl20
-rw-r--r--core/java/android/hardware/radio/RadioAlert.java505
-rw-r--r--core/java/android/view/InsetsController.java4
-rw-r--r--core/java/android/view/ViewProtoLogGroups.java42
-rw-r--r--core/java/android/view/ViewRootImpl.java12
-rw-r--r--core/java/com/android/internal/app/ResolverListAdapter.java7
-rw-r--r--core/res/res/drawable/ic_zen_mode_icon_piano.xml25
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerSnapAlgorithm.java82
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DockedDividerUtils.java10
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java2
-rw-r--r--packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsShadeOverlay.kt9
-rw-r--r--packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/DraggableHandler.kt28
-rw-r--r--packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/MultiPointerDraggable.kt21
-rw-r--r--packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/DraggableHandlerTest.kt28
-rw-r--r--packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SwipeToSceneTest.kt87
-rw-r--r--packages/SystemUI/docs/scene.md3
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsBpViewControllerTest.kt70
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerTest.java1067
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerBaseTest.java161
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerTest.java197
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerWithCoroutinesTest.kt643
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractorTest.kt70
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinderTest.kt7
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt104
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt39
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationListViewModelTest.kt2
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java259
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/util/drawable/DrawableSizeTest.kt31
-rw-r--r--packages/SystemUI/res/layout/super_notification_shade.xml16
-rw-r--r--packages/SystemUI/res/layout/udfps_fpm_empty_view.xml30
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/UdfpsBpView.kt35
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/UdfpsBpViewController.kt47
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java90
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt218
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/UdfpsFpmEmptyView.kt49
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/UdfpsFpmEmptyViewController.kt45
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerLegacy.kt555
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacy.java330
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/UdfpsTouchOverlayBinder.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/AuthMethodBouncerViewModel.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/common/usagestats/data/repository/UsageStatsRepository.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalInteractor.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalSceneInteractor.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/communal/ui/binder/CommunalAppWidgetHostViewBinder.kt4
-rw-r--r--packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/ResizeableItemFrameViewModel.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/communal/util/WidgetViewFactory.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/communal/widgets/WidgetInteractionHandler.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/coroutines/Tracing.kt27
-rw-r--r--packages/SystemUI/src/com/android/systemui/display/data/repository/DisplayScopeRepository.kt4
-rw-r--r--packages/SystemUI/src/com/android/systemui/dreams/homecontrols/HomeControlsDreamService.kt5
-rw-r--r--packages/SystemUI/src/com/android/systemui/education/dagger/ContextualEducationModule.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/haptics/slider/compose/ui/SliderHapticsViewModel.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/CustomizationProvider.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepository.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractor.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractor.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerMessageAreaViewBinder.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerUdfpsViewBinder.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinder.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/DeviceEntryIconViewBinder.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBlueprintViewBinder.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardIndicationAreaBinder.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardLongPressViewBinder.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardPreviewClockViewBinder.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardPreviewSmartspaceViewBinder.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardQuickAffordanceViewBinder.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSettingsViewBinder.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSmartspaceViewBinder.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSurfaceBehindViewBinder.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/LightRevealScrimViewBinder.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/WindowManagerLockscreenVisibilityViewBinder.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt4
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardRemotePreviewManager.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModel.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/lifecycle/Hydrator.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/lifecycle/RepeatWhenAttached.kt62
-rw-r--r--packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorComponent.kt8
-rw-r--r--packages/SystemUI/src/com/android/systemui/navigationbar/gestural/domain/GestureInteractor.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/notetask/NoteTaskController.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt78
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/PaginatedGridLayout.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/QuickQuickSettings.kt3
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileCoroutineScopeFactory.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogManager.kt4
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/impl/location/domain/interactor/LocationTileUserActionInteractor.kt10
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/impl/modes/domain/interactor/ModesTileDataInteractor.kt4
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/impl/saver/domain/DataSaverDialogDelegate.kt7
-rw-r--r--packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/screenshot/ActionExecutor.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/screenshot/ActionIntentExecutor.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotProxyService.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotSoundController.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java36
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImpl.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActionsViewModel.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt29
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/emptyshade/ui/viewmodel/EmptyShadeViewModel.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java17
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationScrollViewBinder.kt30
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt10
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java20
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java134
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconsViewModel.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/util/drawable/DrawableSize.kt83
-rw-r--r--packages/SystemUI/src/com/android/systemui/util/kotlin/GlobalCoroutinesModule.kt11
-rw-r--r--packages/SystemUI/src/com/android/systemui/util/settings/SettingsProxy.kt36
-rw-r--r--packages/SystemUI/src/com/android/systemui/util/settings/UserSettingsProxy.kt34
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/dialog/settings/domain/VolumeDialogSettingsButtonInteractor.kt4
-rw-r--r--packages/SystemUI/tests/res/drawable/layer_drawable_all_same_type.xml (renamed from packages/SystemUI/res/layout/udfps_bp_view.xml)15
-rw-r--r--packages/SystemUI/tests/res/drawable/layer_drawable_different_types.xml20
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt289
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java44
-rw-r--r--services/autofill/bugfixes.aconfig7
-rw-r--r--services/autofill/java/com/android/server/autofill/Session.java3096
-rw-r--r--services/core/java/com/android/server/notification/NotificationManagerInternal.java2
-rw-r--r--services/core/java/com/android/server/notification/NotificationManagerService.java40
-rw-r--r--services/core/java/com/android/server/notification/PreferencesHelper.java6
-rw-r--r--services/core/java/com/android/server/notification/RankingConfig.java2
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java26
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java30
-rw-r--r--tests/Input/src/com/android/test/input/UinputRecordingIntegrationTests.kt4
133 files changed, 3366 insertions, 5988 deletions
diff --git a/AconfigFlags.bp b/AconfigFlags.bp
index c6ce799f0a24..9c766e980e60 100644
--- a/AconfigFlags.bp
+++ b/AconfigFlags.bp
@@ -791,6 +791,12 @@ java_aconfig_library {
],
}
+cc_aconfig_library {
+ name: "android.permission.flags-aconfig-cc",
+ aconfig_declarations: "android.permission.flags-aconfig",
+ host_supported: true,
+}
+
// SQLite
aconfig_declarations {
name: "android.database.sqlite-aconfig",
diff --git a/core/java/android/content/pm/flags.aconfig b/core/java/android/content/pm/flags.aconfig
index c7d7dc1eb0de..52d733314eb6 100644
--- a/core/java/android/content/pm/flags.aconfig
+++ b/core/java/android/content/pm/flags.aconfig
@@ -326,3 +326,11 @@ flag {
bug: "360129103"
is_fixed_read_only: true
}
+
+flag {
+ name: "include_feature_flags_in_package_cacher"
+ namespace: "package_manager_service"
+ description: "Include feature flag status when determining hits or misses in PackageCacher."
+ bug: "364771256"
+ is_fixed_read_only: true
+}
diff --git a/core/java/android/hardware/radio/RadioAlert.aidl b/core/java/android/hardware/radio/RadioAlert.aidl
new file mode 100644
index 000000000000..17f4fc7e9a13
--- /dev/null
+++ b/core/java/android/hardware/radio/RadioAlert.aidl
@@ -0,0 +1,20 @@
+/**
+ * Copyright (C) 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 android.hardware.radio;
+
+/** @hide */
+parcelable RadioAlert; \ No newline at end of file
diff --git a/core/java/android/hardware/radio/RadioAlert.java b/core/java/android/hardware/radio/RadioAlert.java
new file mode 100644
index 000000000000..b55dcd82ef7b
--- /dev/null
+++ b/core/java/android/hardware/radio/RadioAlert.java
@@ -0,0 +1,505 @@
+/**
+ * Copyright (C) 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 android.hardware.radio;
+
+import android.annotation.FlaggedApi;
+import android.annotation.Nullable;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import androidx.annotation.NonNull;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Emergency Alert Message
+ *
+ * <p>Alert message can be sent from a radio station of technologies such as HD radio to
+ * the radio users for some emergency events (see ITU-T X.1303 bis for more info).
+ * @hide
+ */
+@FlaggedApi(Flags.FLAG_HD_RADIO_EMERGENCY_ALERT_SYSTEM)
+public final class RadioAlert implements Parcelable {
+
+ public static final class Geocode implements Parcelable {
+
+ private final String mValueName;
+ private final String mValue;
+
+ /**
+ * Constructor of geocode.
+ *
+ * @param valueName Name of geocode value
+ * @param value Value of geocode
+ * @hide
+ */
+ public Geocode(@NonNull String valueName, @NonNull String value) {
+ mValueName = Objects.requireNonNull(valueName, "Geocode value name can not be null");
+ mValue = Objects.requireNonNull(value, "Geocode value can not be null");
+ }
+
+ private Geocode(Parcel in) {
+ mValueName = in.readString8();
+ mValue = in.readString8();
+ }
+
+ public static final @NonNull Creator<Geocode> CREATOR = new Creator<Geocode>() {
+ @Override
+ public Geocode createFromParcel(Parcel in) {
+ return new Geocode(in);
+ }
+
+ @Override
+ public Geocode[] newArray(int size) {
+ return new Geocode[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeString8(mValueName);
+ dest.writeString8(mValue);
+ }
+
+ @NonNull
+ @Override
+ public String toString() {
+ return "Gecode [valueName=" + mValueName + ", value=" + mValue + "]";
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mValueName, mValue);
+ }
+
+ @Override
+ public boolean equals(@Nullable Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof Geocode other)) {
+ return false;
+ }
+
+ return Objects.equals(mValueName, other.mValueName)
+ && Objects.equals(mValue, other.mValue);
+ }
+ }
+
+ public static final class Coordinate implements Parcelable {
+ private final double mLatitude;
+ private final double mLongitude;
+
+ /**
+ * Constructor of coordinate.
+ *
+ * @param latitude Latitude of the coordinate
+ * @param longitude Longitude of the coordinate
+ * @hide
+ */
+ public Coordinate(double latitude, double longitude) {
+ if (latitude < -90.0 || latitude > 90.0) {
+ throw new IllegalArgumentException("Latitude value should be between -90 and 90");
+ }
+ if (longitude < -180.0 || longitude > 180.0) {
+ throw new IllegalArgumentException(
+ "Longitude value should be between -180 and 180");
+ }
+ mLatitude = latitude;
+ mLongitude = longitude;
+ }
+
+ private Coordinate(Parcel in) {
+ mLatitude = in.readDouble();
+ mLongitude = in.readDouble();
+ }
+
+ public static final @NonNull Creator<Coordinate> CREATOR = new Creator<Coordinate>() {
+ @Override
+ public Coordinate createFromParcel(Parcel in) {
+ return new Coordinate(in);
+ }
+
+ @Override
+ public Coordinate[] newArray(int size) {
+ return new Coordinate[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeDouble(mLatitude);
+ dest.writeDouble(mLongitude);
+ }
+
+ @NonNull
+ @Override
+ public String toString() {
+ return "Coordinate [latitude=" + mLatitude + ", longitude=" + mLongitude + "]";
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mLatitude, mLongitude);
+ }
+
+ @Override
+ public boolean equals(@Nullable Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof Coordinate other)) {
+ return false;
+ }
+ return mLatitude == other.mLatitude && mLongitude == other.mLongitude;
+ }
+ }
+
+ public static final class Polygon implements Parcelable {
+
+ private final List<Coordinate> mCoordinates;
+
+ /**
+ * Constructor of polygon.
+ *
+ * @param coordinates Coordinates the polygon is composed of
+ * @hide
+ */
+ public Polygon(@NonNull List<Coordinate> coordinates) {
+ Objects.requireNonNull(coordinates, "Coordinates can not be null");
+ if (coordinates.size() < 4) {
+ throw new IllegalArgumentException("Number of coordinates must be at least 4");
+ }
+ if (!coordinates.get(0).equals(coordinates.get(coordinates.size() - 1))) {
+ throw new IllegalArgumentException(
+ "The last and first coordinates must be the same");
+ }
+ mCoordinates = coordinates;
+ }
+
+ private Polygon(Parcel in) {
+ mCoordinates = new ArrayList<>();
+ in.readTypedList(mCoordinates, Coordinate.CREATOR);
+ }
+
+ public static final @NonNull Creator<Polygon> CREATOR = new Creator<Polygon>() {
+ @Override
+ public Polygon createFromParcel(Parcel in) {
+ return new Polygon(in);
+ }
+
+ @Override
+ public Polygon[] newArray(int size) {
+ return new Polygon[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeTypedList(mCoordinates);
+ }
+
+ @NonNull
+ @Override
+ public String toString() {
+ return "Polygon [coordinates=" + mCoordinates + "]";
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mCoordinates);
+ }
+
+ @Override
+ public boolean equals(@Nullable Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof Polygon other)) {
+ return false;
+ }
+ return mCoordinates.equals(other.mCoordinates);
+ }
+ }
+
+ public static final class AlertArea implements Parcelable {
+
+ private final List<Polygon> mPolygons;
+ private final List<Geocode> mGeocodes;
+
+ /**
+ * Constructor of alert area.
+ *
+ * @param polygons Polygons used in alert area
+ * @param geocodes Geocodes used in alert area
+ * @hide
+ */
+ public AlertArea(@NonNull List<Polygon> polygons, @NonNull List<Geocode> geocodes) {
+ mPolygons = Objects.requireNonNull(polygons, "Polygons can not be null");
+ mGeocodes = Objects.requireNonNull(geocodes, "Geocodes can not be null");
+ }
+
+ private AlertArea(Parcel in) {
+ mPolygons = new ArrayList<>();
+ mGeocodes = new ArrayList<>();
+ in.readTypedList(mPolygons, Polygon.CREATOR);
+ in.readTypedList(mGeocodes, Geocode.CREATOR);
+ }
+
+ public static final @NonNull Creator<AlertArea> CREATOR = new Creator<AlertArea>() {
+ @Override
+ public AlertArea createFromParcel(Parcel in) {
+ return new AlertArea(in);
+ }
+
+ @Override
+ public AlertArea[] newArray(int size) {
+ return new AlertArea[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeTypedList(mPolygons);
+ dest.writeTypedList(mGeocodes);
+ }
+
+ @NonNull
+ @Override
+ public String toString() {
+ return "AlertArea [polygons=" + mPolygons + ", geocodes=" + mGeocodes + "]";
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mPolygons, mGeocodes);
+ }
+
+ @Override
+ public boolean equals(@Nullable Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof AlertArea other)) {
+ return false;
+ }
+
+ return mPolygons.equals(other.mPolygons) && mGeocodes.equals(other.mGeocodes);
+ }
+ }
+
+ public static final class AlertInfo implements Parcelable {
+
+ private final List<Integer> mCategoryList;
+ private final int mUrgency;
+ private final int mSeverity;
+ private final int mCertainty;
+ private final String mTextualMessage;
+ private final List<AlertArea> mAreaList;
+
+ /**
+ * Constructor for alert info.
+ *
+ * @param categoryList Array of categories of the subject event of the alert message
+ * @param urgency The urgency of the subject event of the alert message
+ * @param severity The severity of the subject event of the alert message
+ * @param certainty The certainty of the subject event of the alert message
+ * @param textualMessage Textual descriptions of the subject event
+ * @param areaList The array of geographic areas to which the alert info segment in which
+ * it appears applies
+ * @hide
+ */
+ public AlertInfo(@NonNull List<Integer> categoryList, int urgency,
+ int severity, int certainty,
+ String textualMessage, @NonNull List<AlertArea> areaList) {
+ mCategoryList = Objects.requireNonNull(categoryList, "Category list can not be null");
+ mUrgency = urgency;
+ mSeverity = severity;
+ mCertainty = certainty;
+ mTextualMessage = textualMessage;
+ mAreaList = Objects.requireNonNull(areaList, "Area list can not be null");
+ }
+
+ private AlertInfo(Parcel in) {
+ mCategoryList = in.readArrayList(Integer.class.getClassLoader(), Integer.class);
+ mUrgency = in.readInt();
+ mSeverity = in.readInt();
+ mCertainty = in.readInt();
+ mTextualMessage = in.readString8();
+ mAreaList = new ArrayList<>();
+ in.readTypedList(mAreaList, AlertArea.CREATOR);
+ }
+
+ public static final @NonNull Creator<AlertInfo> CREATOR = new Creator<AlertInfo>() {
+ @Override
+ public AlertInfo createFromParcel(Parcel in) {
+ return new AlertInfo(in);
+ }
+
+ @Override
+ public AlertInfo[] newArray(int size) {
+ return new AlertInfo[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeList(mCategoryList);
+ dest.writeInt(mUrgency);
+ dest.writeInt(mSeverity);
+ dest.writeInt(mCertainty);
+ dest.writeString8(mTextualMessage);
+ dest.writeTypedList(mAreaList);
+ }
+
+ @NonNull
+ @Override
+ public String toString() {
+ return "AlertInfo [categoryList=" + mCategoryList + ", urgency=" + mUrgency
+ + ", severity=" + mSeverity + ", certainty=" + mCertainty
+ + ", textualMessage=" + mTextualMessage + ", areaList=" + mAreaList + "]";
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mCategoryList, mUrgency, mSeverity, mCertainty, mTextualMessage,
+ mAreaList);
+ }
+
+ @Override
+ public boolean equals(@Nullable Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof AlertInfo other)) {
+ return false;
+ }
+
+ return mCategoryList.equals(other.mCategoryList) && mUrgency == other.mUrgency
+ && mSeverity == other.mSeverity && mCertainty == other.mCertainty
+ && mTextualMessage.equals(other.mTextualMessage)
+ && mAreaList.equals(other.mAreaList);
+ }
+ }
+
+ private final int mStatus;
+ private final int mMessageType;
+ private final List<AlertInfo> mInfoList;
+ private final int mScope;
+
+ /**
+ * Constructor of radio alert message.
+ *
+ * @param status Status of alert message
+ * @param messageType Message type of alert message
+ * @param infoList List of alert info
+ * @param scope Scope of alert message
+ * @hide
+ */
+ public RadioAlert(int status, int messageType,
+ @NonNull List<AlertInfo> infoList, int scope) {
+ mStatus = status;
+ mMessageType = messageType;
+ mInfoList = Objects.requireNonNull(infoList, "Alert info list can not be null");
+ mScope = scope;
+ }
+
+ private RadioAlert(Parcel in) {
+ mStatus = in.readInt();
+ mMessageType = in.readInt();
+ mInfoList = in.readParcelableList(new ArrayList<>(), AlertInfo.class.getClassLoader(),
+ AlertInfo.class);
+ mScope = in.readInt();
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeInt(mStatus);
+ dest.writeInt(mMessageType);
+ dest.writeParcelableList(mInfoList, /* flags= */ 0);
+ dest.writeInt(mScope);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @NonNull
+ @Override
+ public String toString() {
+ return "RadioAlert [status=" + mStatus + ", messageType=" + mMessageType
+ + ", infoList= " + mInfoList + ", scope=" + mScope + "]";
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mStatus, mMessageType, mInfoList, mScope);
+ }
+
+ @Override
+ public boolean equals(@Nullable Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof RadioAlert other)) {
+ return false;
+ }
+
+ return mStatus == other.mStatus && mMessageType == other.mMessageType
+ && mInfoList.equals(other.mInfoList) && mScope == other.mScope;
+ }
+
+ public static final @NonNull Creator<RadioAlert> CREATOR = new Creator<RadioAlert>() {
+ @Override
+ public RadioAlert createFromParcel(Parcel in) {
+ return new RadioAlert(in);
+ }
+
+ @Override
+ public RadioAlert[] newArray(int size) {
+ return new RadioAlert[size];
+ }
+ };
+}
diff --git a/core/java/android/view/InsetsController.java b/core/java/android/view/InsetsController.java
index d08873c56e6a..59c66532fe0b 100644
--- a/core/java/android/view/InsetsController.java
+++ b/core/java/android/view/InsetsController.java
@@ -22,6 +22,7 @@ import static android.view.InsetsControllerProto.CONTROL;
import static android.view.InsetsControllerProto.STATE;
import static android.view.InsetsSource.ID_IME;
import static android.view.InsetsSource.ID_IME_CAPTION_BAR;
+import static android.view.ViewProtoLogGroups.IME_INSETS_CONTROLLER;
import static android.view.WindowInsets.Type.FIRST;
import static android.view.WindowInsets.Type.LAST;
import static android.view.WindowInsets.Type.all;
@@ -69,6 +70,7 @@ import android.view.inputmethod.InputMethodManager;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.inputmethod.ImeTracing;
import com.android.internal.inputmethod.SoftInputShowHideReason;
+import com.android.internal.protolog.ProtoLog;
import com.android.internal.util.function.TriFunction;
import java.io.PrintWriter;
@@ -1920,6 +1922,8 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
final @InsetsType int requestedVisibleTypes =
(mRequestedVisibleTypes & ~mask) | (visibleTypes & mask);
if (mRequestedVisibleTypes != requestedVisibleTypes) {
+ ProtoLog.d(IME_INSETS_CONTROLLER, "Setting requestedVisibleTypes to %d (was %d)",
+ requestedVisibleTypes, mRequestedVisibleTypes);
mRequestedVisibleTypes = requestedVisibleTypes;
}
}
diff --git a/core/java/android/view/ViewProtoLogGroups.java b/core/java/android/view/ViewProtoLogGroups.java
new file mode 100644
index 000000000000..099f76189a50
--- /dev/null
+++ b/core/java/android/view/ViewProtoLogGroups.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 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 android.view;
+
+import android.annotation.NonNull;
+import android.view.inputmethod.Flags;
+
+import com.android.internal.protolog.ProtoLogGroup;
+
+import java.util.UUID;
+
+/**
+ * Defines logging groups for ProtoLog.
+ *
+ * This file is used by the ProtoLogTool to generate optimized logging code. All of its dependencies
+ * must be included in services.core.wm.protologgroups build target.
+ *
+ * @hide
+ */
+final class ViewProtoLogGroups {
+ final static ProtoLogGroup IME_INSETS_CONTROLLER = new ProtoLogGroup(
+ "IME_INSETS_CONTROLLER", "InsetsController", Flags.refactorInsetsController());
+
+ final static ProtoLogGroup[] ALL_GROUPS = {
+ IME_INSETS_CONTROLLER
+ };
+}
+
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 3be9a821a463..182ed1ebad59 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -279,6 +279,7 @@ import com.android.internal.os.IResultReceiver;
import com.android.internal.os.SomeArgs;
import com.android.internal.policy.DecorView;
import com.android.internal.policy.PhoneFallbackEventHandler;
+import com.android.internal.protolog.ProtoLog;
import com.android.internal.util.FastPrintWriter;
import com.android.internal.view.BaseSurfaceHolder;
import com.android.internal.view.RootViewSurfaceTaker;
@@ -1282,6 +1283,8 @@ public final class ViewRootImpl implements ViewParent,
mIsStylusPointerIconEnabled =
InputSettings.isStylusPointerIconEnabled(mContext);
+ initializeProtoLogInProcess();
+
String processorOverrideName = context.getResources().getString(
R.string.config_inputEventCompatProcessorOverrideClassName);
if (processorOverrideName.isEmpty()) {
@@ -13403,4 +13406,13 @@ public final class ViewRootImpl implements ViewParent,
mCurrentColorMode = colorMode;
}
+
+ private static boolean sProtoLogInitialized = false;
+
+ private void initializeProtoLogInProcess() {
+ if (!sProtoLogInitialized) {
+ ProtoLog.init(ViewProtoLogGroups.ALL_GROUPS);
+ sProtoLogInitialized = true;
+ }
+ }
}
diff --git a/core/java/com/android/internal/app/ResolverListAdapter.java b/core/java/com/android/internal/app/ResolverListAdapter.java
index 18c8eb4ec46b..de7ad346a7cd 100644
--- a/core/java/com/android/internal/app/ResolverListAdapter.java
+++ b/core/java/com/android/internal/app/ResolverListAdapter.java
@@ -1195,7 +1195,12 @@ public class ResolverListAdapter extends BaseAdapter {
@Nullable
protected Drawable loadIconFromResource(Resources res, int resId) {
- return res.getDrawableForDensity(resId, mIconDpi);
+ try {
+ return res.getDrawableForDensity(resId, mIconDpi);
+ } catch (Resources.NotFoundException e) {
+ Log.e(TAG, "Resource not found", e);
+ return null;
+ }
}
}
diff --git a/core/res/res/drawable/ic_zen_mode_icon_piano.xml b/core/res/res/drawable/ic_zen_mode_icon_piano.xml
new file mode 100644
index 000000000000..012b9398d687
--- /dev/null
+++ b/core/res/res/drawable/ic_zen_mode_icon_piano.xml
@@ -0,0 +1,25 @@
+<!--
+Copyright (C) 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:tint="?android:attr/colorControlNormal"
+ android:viewportHeight="960"
+ android:viewportWidth="960">
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M200,840Q167,840 143.5,816.5Q120,793 120,760L120,200Q120,167 143.5,143.5Q167,120 200,120L760,120Q793,120 816.5,143.5Q840,167 840,200L840,760Q840,793 816.5,816.5Q793,840 760,840L200,840ZM200,760L330,760L330,580L320,580Q303,580 291.5,568.5Q280,557 280,540L280,200L200,200Q200,200 200,200Q200,200 200,200L200,760Q200,760 200,760Q200,760 200,760ZM630,760L760,760Q760,760 760,760Q760,760 760,760L760,200Q760,200 760,200Q760,200 760,200L680,200L680,540Q680,557 668.5,568.5Q657,580 640,580L630,580L630,760ZM390,760L570,760L570,580L560,580Q543,580 531.5,568.5Q520,557 520,540L520,200L440,200L440,540Q440,557 428.5,568.5Q417,580 400,580L390,580L390,760Z" />
+</vector> \ No newline at end of file
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerSnapAlgorithm.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerSnapAlgorithm.java
index 0b2b3e7c41c8..85921703d559 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerSnapAlgorithm.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerSnapAlgorithm.java
@@ -87,7 +87,7 @@ public class DividerSnapAlgorithm {
private final boolean mCalculateRatiosBasedOnAvailableSpace;
/** Allows split ratios that go offscreen (a.k.a. "flexible split") */
private final boolean mAllowOffscreenRatios;
- private final boolean mIsHorizontalDivision;
+ private final boolean mIsLeftRightSplit;
/** The first target which is still splitting the screen */
private final SnapTarget mFirstSplitTarget;
@@ -101,13 +101,13 @@ public class DividerSnapAlgorithm {
public DividerSnapAlgorithm(Resources res, int displayWidth, int displayHeight, int dividerSize,
- boolean isHorizontalDivision, Rect insets, int dockSide) {
- this(res, displayWidth, displayHeight, dividerSize, isHorizontalDivision, insets,
- dockSide, false /* minimized */, true /* resizable */);
+ boolean isLeftRightSplit, Rect insets, int dockSide) {
+ this(res, displayWidth, displayHeight, dividerSize, isLeftRightSplit, insets,
+ dockSide, false /* minimized */, true /* resizable */);
}
public DividerSnapAlgorithm(Resources res, int displayWidth, int displayHeight, int dividerSize,
- boolean isHorizontalDivision, Rect insets, int dockSide, boolean isMinimizedMode,
+ boolean isLeftRightSplit, Rect insets, int dockSide, boolean isMinimizedMode,
boolean isHomeResizable) {
mMinFlingVelocityPxPerSecond =
MIN_FLING_VELOCITY_DP_PER_SECOND * res.getDisplayMetrics().density;
@@ -116,7 +116,7 @@ public class DividerSnapAlgorithm {
mDividerSize = dividerSize;
mDisplayWidth = displayWidth;
mDisplayHeight = displayHeight;
- mIsHorizontalDivision = isHorizontalDivision;
+ mIsLeftRightSplit = isLeftRightSplit;
mInsets.set(insets);
mSnapMode = isMinimizedMode ? SNAP_MODE_MINIMIZED :
res.getInteger(com.android.internal.R.integer.config_dockedStackDividerSnapMode);
@@ -133,7 +133,7 @@ public class DividerSnapAlgorithm {
Flags.enableFlexibleTwoAppSplit() && SplitScreenUtils.allowOffscreenRatios(res);
mTaskHeightInMinimizedMode = isHomeResizable ? res.getDimensionPixelSize(
com.android.internal.R.dimen.task_height_of_minimized_mode) : 0;
- calculateTargets(isHorizontalDivision, dockSide);
+ calculateTargets(isLeftRightSplit, dockSide);
mFirstSplitTarget = mTargets.get(1);
mLastSplitTarget = mTargets.get(mTargets.size() - 2);
mDismissStartTarget = mTargets.get(0);
@@ -218,18 +218,18 @@ public class DividerSnapAlgorithm {
}
private int getStartInset() {
- if (mIsHorizontalDivision) {
- return mInsets.top;
- } else {
+ if (mIsLeftRightSplit) {
return mInsets.left;
+ } else {
+ return mInsets.top;
}
}
private int getEndInset() {
- if (mIsHorizontalDivision) {
- return mInsets.bottom;
- } else {
+ if (mIsLeftRightSplit) {
return mInsets.right;
+ } else {
+ return mInsets.bottom;
}
}
@@ -269,11 +269,11 @@ public class DividerSnapAlgorithm {
return mTargets.get(minIndex);
}
- private void calculateTargets(boolean isHorizontalDivision, int dockedSide) {
+ private void calculateTargets(boolean isLeftRightSplit, int dockedSide) {
mTargets.clear();
- int dividerMax = isHorizontalDivision
- ? mDisplayHeight
- : mDisplayWidth;
+ int dividerMax = isLeftRightSplit
+ ? mDisplayWidth
+ : mDisplayHeight;
int startPos = -mDividerSize;
if (dockedSide == DOCKED_RIGHT) {
startPos += mInsets.left;
@@ -281,38 +281,38 @@ public class DividerSnapAlgorithm {
mTargets.add(new SnapTarget(startPos, SNAP_TO_START_AND_DISMISS, 0.35f));
switch (mSnapMode) {
case SNAP_MODE_16_9:
- addRatio16_9Targets(isHorizontalDivision, dividerMax);
+ addRatio16_9Targets(isLeftRightSplit, dividerMax);
break;
case SNAP_FIXED_RATIO:
- addFixedDivisionTargets(isHorizontalDivision, dividerMax);
+ addFixedDivisionTargets(isLeftRightSplit, dividerMax);
break;
case SNAP_ONLY_1_1:
- addMiddleTarget(isHorizontalDivision);
+ addMiddleTarget(isLeftRightSplit);
break;
case SNAP_MODE_MINIMIZED:
- addMinimizedTarget(isHorizontalDivision, dockedSide);
+ addMinimizedTarget(isLeftRightSplit, dockedSide);
break;
}
mTargets.add(new SnapTarget(dividerMax, SNAP_TO_END_AND_DISMISS, 0.35f));
}
- private void addNonDismissingTargets(boolean isHorizontalDivision, int topPosition,
+ private void addNonDismissingTargets(boolean isLeftRightSplit, int topPosition,
int bottomPosition, int dividerMax) {
@PersistentSnapPosition int firstTarget =
mAllowOffscreenRatios ? SNAP_TO_2_10_90 : SNAP_TO_2_33_66;
@PersistentSnapPosition int lastTarget =
mAllowOffscreenRatios ? SNAP_TO_2_90_10 : SNAP_TO_2_66_33;
maybeAddTarget(topPosition, topPosition - getStartInset(), firstTarget);
- addMiddleTarget(isHorizontalDivision);
+ addMiddleTarget(isLeftRightSplit);
maybeAddTarget(bottomPosition,
dividerMax - getEndInset() - (bottomPosition + mDividerSize), lastTarget);
}
- private void addFixedDivisionTargets(boolean isHorizontalDivision, int dividerMax) {
- int start = isHorizontalDivision ? mInsets.top : mInsets.left;
- int end = isHorizontalDivision
- ? mDisplayHeight - mInsets.bottom
- : mDisplayWidth - mInsets.right;
+ private void addFixedDivisionTargets(boolean isLeftRightSplit, int dividerMax) {
+ int start = isLeftRightSplit ? mInsets.left : mInsets.top;
+ int end = isLeftRightSplit
+ ? mDisplayWidth - mInsets.right
+ : mDisplayHeight - mInsets.bottom;
int size = (int) (mFixedRatio * (end - start)) - mDividerSize / 2;
if (mAllowOffscreenRatios) {
@@ -323,23 +323,23 @@ public class DividerSnapAlgorithm {
}
int topPosition = start + size;
int bottomPosition = end - size - mDividerSize;
- addNonDismissingTargets(isHorizontalDivision, topPosition, bottomPosition, dividerMax);
+ addNonDismissingTargets(isLeftRightSplit, topPosition, bottomPosition, dividerMax);
}
- private void addRatio16_9Targets(boolean isHorizontalDivision, int dividerMax) {
- int start = isHorizontalDivision ? mInsets.top : mInsets.left;
- int end = isHorizontalDivision
- ? mDisplayHeight - mInsets.bottom
- : mDisplayWidth - mInsets.right;
- int startOther = isHorizontalDivision ? mInsets.left : mInsets.top;
- int endOther = isHorizontalDivision
+ private void addRatio16_9Targets(boolean isLeftRightSplit, int dividerMax) {
+ int start = isLeftRightSplit ? mInsets.left : mInsets.top;
+ int end = isLeftRightSplit
? mDisplayWidth - mInsets.right
: mDisplayHeight - mInsets.bottom;
+ int startOther = isLeftRightSplit ? mInsets.top : mInsets.left;
+ int endOther = isLeftRightSplit
+ ? mDisplayHeight - mInsets.bottom
+ : mDisplayWidth - mInsets.right;
float size = 9.0f / 16.0f * (endOther - startOther);
int sizeInt = (int) Math.floor(size);
int topPosition = start + sizeInt;
int bottomPosition = end - sizeInt - mDividerSize;
- addNonDismissingTargets(isHorizontalDivision, topPosition, bottomPosition, dividerMax);
+ addNonDismissingTargets(isLeftRightSplit, topPosition, bottomPosition, dividerMax);
}
/**
@@ -352,17 +352,17 @@ public class DividerSnapAlgorithm {
}
}
- private void addMiddleTarget(boolean isHorizontalDivision) {
- int position = DockedDividerUtils.calculateMiddlePosition(isHorizontalDivision,
+ private void addMiddleTarget(boolean isLeftRightSplit) {
+ int position = DockedDividerUtils.calculateMiddlePosition(isLeftRightSplit,
mInsets, mDisplayWidth, mDisplayHeight, mDividerSize);
mTargets.add(new SnapTarget(position, SNAP_TO_2_50_50));
}
- private void addMinimizedTarget(boolean isHorizontalDivision, int dockedSide) {
+ private void addMinimizedTarget(boolean isLeftRightSplit, int dockedSide) {
// In portrait offset the position by the statusbar height, in landscape add the statusbar
// height as well to match portrait offset
int position = mTaskHeightInMinimizedMode + mInsets.top;
- if (!isHorizontalDivision) {
+ if (isLeftRightSplit) {
if (dockedSide == DOCKED_LEFT) {
position += mInsets.left;
} else if (dockedSide == DOCKED_RIGHT) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DockedDividerUtils.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DockedDividerUtils.java
index f25dfeafb32c..25157c05d0de 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DockedDividerUtils.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DockedDividerUtils.java
@@ -97,12 +97,12 @@ public class DockedDividerUtils {
}
}
- public static int calculateMiddlePosition(boolean isHorizontalDivision, Rect insets,
+ public static int calculateMiddlePosition(boolean isLeftRightSplit, Rect insets,
int displayWidth, int displayHeight, int dividerSize) {
- int start = isHorizontalDivision ? insets.top : insets.left;
- int end = isHorizontalDivision
- ? displayHeight - insets.bottom
- : displayWidth - insets.right;
+ int start = isLeftRightSplit ? insets.left : insets.top;
+ int end = isLeftRightSplit
+ ? displayWidth - insets.right
+ : displayHeight - insets.bottom;
return start + (end - start) / 2 - dividerSize / 2;
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java
index c9c3aa0dd537..f73065ea8eb8 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java
@@ -665,7 +665,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
rootBounds.width(),
rootBounds.height(),
mDividerSize,
- !mIsLeftRightSplit,
+ mIsLeftRightSplit,
insets,
mIsLeftRightSplit ? DOCKED_LEFT : DOCKED_TOP /* dockSide */);
}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsShadeOverlay.kt b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsShadeOverlay.kt
index 54497f621c73..2a91bd8b1d73 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsShadeOverlay.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsShadeOverlay.kt
@@ -133,7 +133,14 @@ fun SceneScope.QuickSettingsLayout(
Column(
verticalArrangement = Arrangement.spacedBy(QuickSettingsShade.Dimensions.Padding),
horizontalAlignment = Alignment.CenterHorizontally,
- modifier = modifier.fillMaxWidth().padding(QuickSettingsShade.Dimensions.Padding),
+ modifier =
+ modifier
+ .fillMaxWidth()
+ .padding(
+ start = QuickSettingsShade.Dimensions.Padding,
+ end = QuickSettingsShade.Dimensions.Padding,
+ top = QuickSettingsShade.Dimensions.Padding,
+ ),
) {
BrightnessSliderContainer(
viewModel = viewModel.brightnessSliderViewModel,
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/DraggableHandler.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/DraggableHandler.kt
index 7e288ddd3a4c..9f99c372e2a8 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/DraggableHandler.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/DraggableHandler.kt
@@ -631,7 +631,13 @@ internal class NestedScrollHandlerImpl(
return@PriorityNestedScrollConnection false
}
- _lastPointersInfo = pointersInfoOwner.pointersInfo()
+ val pointersInfo = pointersInfoOwner.pointersInfo()
+
+ if (pointersInfo.isMouseWheel) {
+ // Do not support mouse wheel interactions
+ return@PriorityNestedScrollConnection false
+ }
+ _lastPointersInfo = pointersInfo
// If the current swipe transition is *not* closed to 0f or 1f, then we want the
// scroll events to intercept the current transition to continue the scene
@@ -650,7 +656,12 @@ internal class NestedScrollHandlerImpl(
val isZeroOffset =
if (isExternalOverscrollGesture()) false else offsetBeforeStart == 0f
- _lastPointersInfo = pointersInfoOwner.pointersInfo()
+ val pointersInfo = pointersInfoOwner.pointersInfo()
+ if (pointersInfo.isMouseWheel) {
+ // Do not support mouse wheel interactions
+ return@PriorityNestedScrollConnection false
+ }
+ _lastPointersInfo = pointersInfo
val canStart =
when (behavior) {
@@ -685,7 +696,12 @@ internal class NestedScrollHandlerImpl(
// We could start an overscroll animation
canChangeScene = false
- _lastPointersInfo = pointersInfoOwner.pointersInfo()
+ val pointersInfo = pointersInfoOwner.pointersInfo()
+ if (pointersInfo.isMouseWheel) {
+ // Do not support mouse wheel interactions
+ return@PriorityNestedScrollConnection false
+ }
+ _lastPointersInfo = pointersInfo
val canStart = behavior.canStartOnPostFling && hasNextScene(velocityAvailable)
if (canStart) {
@@ -707,6 +723,12 @@ internal class NestedScrollHandlerImpl(
onScroll = { offsetAvailable, _ ->
val controller = dragController ?: error("Should be called after onStart")
+ val pointersInfo = pointersInfoOwner.pointersInfo()
+ if (pointersInfo.isMouseWheel) {
+ // Do not support mouse wheel interactions
+ return@PriorityNestedScrollConnection 0f
+ }
+
// TODO(b/297842071) We should handle the overscroll or slow drag if the gesture is
// initiated in a nested child.
controller.onDrag(delta = offsetAvailable)
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/MultiPointerDraggable.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/MultiPointerDraggable.kt
index aa70a0ce156b..8613f6da0f62 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/MultiPointerDraggable.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/MultiPointerDraggable.kt
@@ -29,6 +29,7 @@ import androidx.compose.ui.input.nestedscroll.NestedScrollSource
import androidx.compose.ui.input.pointer.AwaitPointerEventScope
import androidx.compose.ui.input.pointer.PointerEvent
import androidx.compose.ui.input.pointer.PointerEventPass
+import androidx.compose.ui.input.pointer.PointerEventType
import androidx.compose.ui.input.pointer.PointerId
import androidx.compose.ui.input.pointer.PointerInputChange
import androidx.compose.ui.input.pointer.PointerInputScope
@@ -184,6 +185,7 @@ internal class MultiPointerDraggableNode(
private var startedPosition: Offset? = null
private var pointersDown: Int = 0
+ private var isMouseWheel: Boolean = false
internal fun pointersInfo(): PointersInfo {
return PointersInfo(
@@ -191,6 +193,7 @@ internal class MultiPointerDraggableNode(
startedPosition = startedPosition,
// We could have 0 pointers during fling or for other reasons.
pointersDown = pointersDown.coerceAtLeast(1),
+ isMouseWheel = isMouseWheel,
)
}
@@ -202,8 +205,15 @@ internal class MultiPointerDraggableNode(
// [requireAncestorPointersInfoOwner], to our descendants.
while (currentContext.isActive) {
// During the Initial pass, we receive the event after our ancestors.
- val changes = awaitPointerEvent(PointerEventPass.Initial).changes
+ val pointerEvent = awaitPointerEvent(PointerEventPass.Initial)
+
+ // Ignore cursor has entered the input region.
+ // This will only be sent after the cursor is hovering when in the input region.
+ if (pointerEvent.type == PointerEventType.Enter) continue
+
+ val changes = pointerEvent.changes
pointersDown = changes.countDown()
+ isMouseWheel = pointerEvent.type == PointerEventType.Scroll
when {
// There are no more pointers down.
@@ -223,7 +233,8 @@ internal class MultiPointerDraggableNode(
// The first pointer down, startedPosition was not set.
startedPosition == null -> {
- val firstPointerDown = changes.single()
+ // Mouse wheel could start with multiple pointer down
+ val firstPointerDown = changes.first()
velocityPointerId = firstPointerDown.id
velocityTracker.resetTracking()
velocityTracker.addPointerInputChange(firstPointerDown)
@@ -647,4 +658,8 @@ internal fun interface PointersInfoOwner {
fun pointersInfo(): PointersInfo
}
-internal data class PointersInfo(val startedPosition: Offset?, val pointersDown: Int)
+internal data class PointersInfo(
+ val startedPosition: Offset?,
+ val pointersDown: Int,
+ val isMouseWheel: Boolean,
+)
diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/DraggableHandlerTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/DraggableHandlerTest.kt
index 57b9423e85d1..a0fed9064181 100644
--- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/DraggableHandlerTest.kt
+++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/DraggableHandlerTest.kt
@@ -127,7 +127,7 @@ class DraggableHandlerTest {
val horizontalDraggableHandler = layoutImpl.draggableHandler(Orientation.Horizontal)
var pointerInfoOwner: () -> PointersInfo = {
- PointersInfo(startedPosition = Offset.Zero, pointersDown = 1)
+ PointersInfo(startedPosition = Offset.Zero, pointersDown = 1, isMouseWheel = false)
}
fun nestedScrollConnection(
@@ -1187,7 +1187,9 @@ class DraggableHandlerTest {
val nestedScroll = nestedScrollConnection(nestedScrollBehavior = EdgeAlways)
// Drag from the **top** of the screen
- pointerInfoOwner = { PointersInfo(startedPosition = Offset(0f, 0f), pointersDown = 1) }
+ pointerInfoOwner = {
+ PointersInfo(startedPosition = Offset(0f, 0f), pointersDown = 1, isMouseWheel = false)
+ }
assertIdle(currentScene = SceneC)
nestedScroll.scroll(available = upOffset(fractionOfScreen = 0.1f))
@@ -1205,7 +1207,11 @@ class DraggableHandlerTest {
// Drag from the **bottom** of the screen
pointerInfoOwner = {
- PointersInfo(startedPosition = Offset(0f, SCREEN_SIZE), pointersDown = 1)
+ PointersInfo(
+ startedPosition = Offset(0f, SCREEN_SIZE),
+ pointersDown = 1,
+ isMouseWheel = false,
+ )
}
assertIdle(currentScene = SceneC)
@@ -1220,6 +1226,22 @@ class DraggableHandlerTest {
}
@Test
+ fun ignoreMouseWheel() = runGestureTest {
+ // Start at scene C.
+ navigateToSceneC()
+ val nestedScroll = nestedScrollConnection(nestedScrollBehavior = EdgeAlways)
+
+ // Use mouse wheel
+ pointerInfoOwner = {
+ PointersInfo(startedPosition = Offset(0f, 0f), pointersDown = 1, isMouseWheel = true)
+ }
+ assertIdle(currentScene = SceneC)
+
+ nestedScroll.scroll(available = upOffset(fractionOfScreen = 0.1f))
+ assertIdle(currentScene = SceneC)
+ }
+
+ @Test
fun transitionIsImmediatelyUpdatedWhenReleasingFinger() = runGestureTest {
// Swipe up from the middle to transition to scene B.
val middle = Offset(SCREEN_SIZE / 2f, SCREEN_SIZE / 2f)
diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SwipeToSceneTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SwipeToSceneTest.kt
index 1711f3145cae..3001505d0e02 100644
--- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SwipeToSceneTest.kt
+++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SwipeToSceneTest.kt
@@ -17,6 +17,8 @@
package com.android.compose.animation.scene
import androidx.compose.foundation.gestures.Orientation
+import androidx.compose.foundation.gestures.rememberScrollableState
+import androidx.compose.foundation.gestures.scrollable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
@@ -39,12 +41,14 @@ import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.platform.LocalViewConfiguration
import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.test.ScrollWheel
import androidx.compose.ui.test.assertPositionInRootIsEqualTo
import androidx.compose.ui.test.assertTextEquals
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.onRoot
import androidx.compose.ui.test.performClick
+import androidx.compose.ui.test.performMouseInput
import androidx.compose.ui.test.performTouchInput
import androidx.compose.ui.test.swipeRight
import androidx.compose.ui.test.swipeUp
@@ -498,6 +502,89 @@ class SwipeToSceneTest {
}
@Test
+ fun mouseWheel_pointerInputApi_ignoredByStl() {
+ val layoutState = layoutState()
+ var touchSlop = 0f
+ rule.setContent {
+ touchSlop = LocalViewConfiguration.current.touchSlop
+ TestContent(layoutState)
+ }
+
+ rule.onRoot().performMouseInput {
+ enter(middle)
+ scroll(touchSlop, ScrollWheel.Vertical)
+ }
+
+ // Mouse wheel scroll are ignored
+ assertThat(layoutState.currentTransition).isNull()
+ }
+
+ @Test
+ fun mouseWheel_scrollableCannotScroll_ignoredByStl() {
+ val layoutState = layoutState()
+ var touchSlop = 0f
+ rule.setContent {
+ touchSlop = LocalViewConfiguration.current.touchSlop
+ SceneTransitionLayout(layoutState, Modifier.size(LayoutWidth, LayoutHeight)) {
+ scene(SceneA, userActions = mapOf(Swipe.Down to SceneB)) {
+ Box(
+ Modifier.fillMaxSize()
+ // A scrollable that does not consume the scroll gesture
+ .scrollable(rememberScrollableState { 0f }, Orientation.Vertical)
+ )
+ }
+ scene(SceneB) { Box(Modifier.fillMaxSize()) }
+ }
+ }
+
+ rule.onRoot().performMouseInput {
+ enter(middle)
+ scroll(touchSlop, ScrollWheel.Vertical)
+ }
+
+ // Mouse wheel scroll are ignored
+ assertThat(layoutState.currentTransition).isNull()
+ }
+
+ @Test
+ fun mouseWheel_scrollableConsume_ignoredByStl() {
+ val layoutState = layoutState()
+ var touchSlop = 0f
+ var lastScroll = 0f
+ rule.setContent {
+ touchSlop = LocalViewConfiguration.current.touchSlop
+ SceneTransitionLayout(layoutState, Modifier.size(LayoutWidth, LayoutHeight)) {
+ scene(SceneA, userActions = mapOf(Swipe.Down to SceneB)) {
+ Box(
+ Modifier.fillMaxSize()
+ // A scrollable that consumes the scroll gesture
+ .scrollable(
+ rememberScrollableState {
+ lastScroll = it
+ it
+ },
+ Orientation.Vertical,
+ )
+ )
+ }
+ scene(SceneB) { Box(Modifier.fillMaxSize()) }
+ }
+ }
+
+ rule.onRoot().performMouseInput {
+ enter(middle)
+ scroll(touchSlop * 10, ScrollWheel.Vertical)
+ }
+
+ // Mouse wheel scroll are ignored
+ assertThat(layoutState.currentTransition).isNull()
+
+ // Mouse wheel scroll can still be consumed by the scrollable
+ assertThat(lastScroll).isNotEqualTo(0f)
+ assertThat(touchSlop).isNotEqualTo(0f)
+ }
+
+ @Test
fun transitionKey() {
val transitionkey = TransitionKey(debugName = "foo")
val state =
diff --git a/packages/SystemUI/docs/scene.md b/packages/SystemUI/docs/scene.md
index 234c7a032d2e..bf15b4feadfb 100644
--- a/packages/SystemUI/docs/scene.md
+++ b/packages/SystemUI/docs/scene.md
@@ -63,7 +63,7 @@ the instructions below to turn it on.
NOTE: in case these instructions become stale and don't actually enable the
framework, please make sure `SceneContainerFlag.isEnabled` in the
[`SceneContainerFlag.kt`](https://cs.android.com/android/platform/superproject/main/+/main:frameworks/base/packages/SystemUI/src/com/android/systemui/scene/shared/flag/SceneContainerFlag.kt)
-file evalutes to `true`.
+file evaluates to `true`.
1. Set a collection of **aconfig flags** to `true` by running the following
commands:
@@ -73,7 +73,6 @@ file evalutes to `true`.
$ adb shell device_config override systemui com.android.systemui.migrate_clocks_to_blueprint true
$ adb shell device_config override systemui com.android.systemui.notification_avalanche_throttle_hun true
$ adb shell device_config override systemui com.android.systemui.predictive_back_sysui true
- $ adb shell device_config override systemui com.android.systemui.device_entry_udfps_refactor true
$ adb shell device_config override systemui com.android.systemui.scene_container true
```
2. **Restart** System UI by issuing the following command:
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsBpViewControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsBpViewControllerTest.kt
deleted file mode 100644
index 13306becf6d2..000000000000
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsBpViewControllerTest.kt
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 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 com.android.systemui.biometrics
-
-import android.testing.TestableLooper
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.biometrics.domain.interactor.UdfpsOverlayInteractor
-import com.android.systemui.dump.DumpManager
-import com.android.systemui.plugins.statusbar.StatusBarStateController
-import com.android.systemui.shade.domain.interactor.ShadeInteractor
-import com.android.systemui.statusbar.phone.SystemUIDialogManager
-import org.junit.Assert.assertFalse
-import org.junit.Before
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.Mock
-import org.mockito.junit.MockitoJUnit
-
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-@TestableLooper.RunWithLooper
-class UdfpsBpViewControllerTest : SysuiTestCase() {
-
- @JvmField @Rule var rule = MockitoJUnit.rule()
-
- @Mock lateinit var udfpsBpView: UdfpsBpView
- @Mock lateinit var statusBarStateController: StatusBarStateController
- @Mock lateinit var shadeInteractor: ShadeInteractor
- @Mock lateinit var systemUIDialogManager: SystemUIDialogManager
- @Mock lateinit var dumpManager: DumpManager
- @Mock lateinit var udfpsOverlayInteractor: UdfpsOverlayInteractor
-
- private lateinit var udfpsBpViewController: UdfpsBpViewController
-
- @Before
- fun setup() {
- udfpsBpViewController =
- UdfpsBpViewController(
- udfpsBpView,
- statusBarStateController,
- shadeInteractor,
- systemUIDialogManager,
- dumpManager,
- udfpsOverlayInteractor,
- )
- }
-
- @TestableLooper.RunWithLooper(setAsMainLooper = true)
- @Test
- fun testShouldNeverPauseAuth() {
- assertFalse(udfpsBpViewController.shouldPauseAuth())
- }
-}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
index 437a4b357372..21c6583d4e84 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
@@ -16,34 +16,17 @@
package com.android.systemui.biometrics;
-import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_GOOD;
-import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_START;
-import static android.view.MotionEvent.ACTION_DOWN;
-import static android.view.MotionEvent.ACTION_MOVE;
-import static android.view.MotionEvent.ACTION_UP;
-
-import static com.android.internal.util.FunctionalUtils.ThrowingConsumer;
-import static com.android.systemui.classifier.Classifier.UDFPS_AUTHENTICATION;
-
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertTrue;
-
import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
-import static org.mockito.ArgumentMatchers.anyFloat;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.graphics.Rect;
-import android.hardware.biometrics.BiometricFingerprintConstants;
import android.hardware.biometrics.BiometricRequestConstants;
import android.hardware.biometrics.ComponentInfoInternal;
import android.hardware.biometrics.SensorProperties;
@@ -58,13 +41,9 @@ import android.os.Handler;
import android.os.PowerManager;
import android.os.RemoteException;
import android.testing.TestableLooper.RunWithLooper;
-import android.util.Pair;
-import android.view.HapticFeedbackConstants;
import android.view.LayoutInflater;
-import android.view.MotionEvent;
import android.view.Surface;
import android.view.View;
-import android.view.ViewGroup;
import android.view.ViewRootImpl;
import android.view.accessibility.AccessibilityManager;
@@ -75,15 +54,11 @@ import com.android.app.viewcapture.ViewCaptureAwareWindowManager;
import com.android.internal.logging.InstanceIdSequence;
import com.android.internal.util.LatencyTracker;
import com.android.keyguard.KeyguardUpdateMonitor;
-import com.android.systemui.Flags;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.animation.ActivityTransitionAnimator;
import com.android.systemui.biometrics.domain.interactor.UdfpsOverlayInteractor;
import com.android.systemui.biometrics.shared.model.UdfpsOverlayParams;
-import com.android.systemui.biometrics.udfps.InteractionEvent;
-import com.android.systemui.biometrics.udfps.NormalizedTouchData;
import com.android.systemui.biometrics.udfps.SinglePointerTouchProcessor;
-import com.android.systemui.biometrics.udfps.TouchProcessorResult;
import com.android.systemui.biometrics.ui.viewmodel.DefaultUdfpsTouchOverlayViewModel;
import com.android.systemui.biometrics.ui.viewmodel.DeviceEntryUdfpsTouchOverlayViewModel;
import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor;
@@ -102,7 +77,6 @@ import com.android.systemui.power.data.repository.FakePowerRepository;
import com.android.systemui.power.domain.interactor.PowerInteractor;
import com.android.systemui.power.shared.model.WakeSleepReason;
import com.android.systemui.power.shared.model.WakefulnessState;
-import com.android.systemui.res.R;
import com.android.systemui.shade.domain.interactor.ShadeInteractor;
import com.android.systemui.statusbar.LockscreenShadeTransitionController;
import com.android.systemui.statusbar.VibratorHelper;
@@ -130,7 +104,6 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
-import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
@@ -204,16 +177,6 @@ public class UdfpsControllerTest extends SysuiTestCase {
private FeatureFlags mFeatureFlags;
// Stuff for configuring mocks
@Mock
- private UdfpsView mUdfpsView;
- @Mock
- private UdfpsBpView mBpView;
- @Mock
- private UdfpsFpmEmptyView mFpmEmptyView;
- @Mock
- private UdfpsKeyguardViewLegacy mKeyguardView;
- private final UdfpsAnimationViewController mUdfpsKeyguardViewController =
- mock(UdfpsKeyguardViewControllerLegacy.class);
- @Mock
private SystemUIDialogManager mSystemUIDialogManager;
@Mock
private ActivityTransitionAnimator mActivityTransitionAnimator;
@@ -241,8 +204,6 @@ public class UdfpsControllerTest extends SysuiTestCase {
@Captor
private ArgumentCaptor<View> mViewCaptor;
@Captor
- private ArgumentCaptor<UdfpsView.OnTouchListener> mTouchListenerCaptor;
- @Captor
private ArgumentCaptor<View.OnHoverListener> mHoverListenerCaptor;
@Captor
private ArgumentCaptor<Runnable> mOnDisplayConfiguredCaptor;
@@ -287,18 +248,9 @@ public class UdfpsControllerTest extends SysuiTestCase {
mContext.getOrCreateTestableResources()
.addOverride(com.android.internal.R.bool.config_ignoreUdfpsVote, false);
- when(mLayoutInflater.inflate(R.layout.udfps_view, null, false))
- .thenReturn(mUdfpsView);
- when(mLayoutInflater.inflate(R.layout.udfps_keyguard_view_legacy, null))
- .thenReturn(mKeyguardView); // for showOverlay REASON_AUTH_FPM_KEYGUARD
- when(mLayoutInflater.inflate(R.layout.udfps_bp_view, null))
- .thenReturn(mBpView);
- when(mLayoutInflater.inflate(R.layout.udfps_fpm_empty_view, null))
- .thenReturn(mFpmEmptyView);
when(mKeyguardUpdateMonitor.isFingerprintDetectionRunning()).thenReturn(true);
when(mSessionTracker.getSessionId(anyInt())).thenReturn(
(new InstanceIdSequence(1 << 20)).newInstanceId());
- when(mUdfpsView.getViewRootImpl()).thenReturn(mViewRootImpl);
final List<ComponentInfoInternal> componentInfo = new ArrayList<>();
componentInfo.add(new ComponentInfoInternal("faceSensor" /* componentId */,
@@ -327,7 +279,6 @@ public class UdfpsControllerTest extends SysuiTestCase {
// Create a fake background executor.
mBiometricExecutor = new FakeExecutor(new FakeSystemClock());
- mSetFlagsRule.disableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR);
initUdfpsController(mOpticalProps);
}
@@ -349,7 +300,6 @@ public class UdfpsControllerTest extends SysuiTestCase {
mFalsingManager,
mPowerManager,
mAccessibilityManager,
- mLockscreenShadeTransitionController,
mScreenLifecycle,
mVibrator,
mUdfpsHapticsSimulator,
@@ -390,101 +340,6 @@ public class UdfpsControllerTest extends SysuiTestCase {
}
@Test
- public void dozeTimeTick() throws RemoteException {
- mOverlayController.showUdfpsOverlay(TEST_REQUEST_ID, mOpticalProps.sensorId,
- BiometricRequestConstants.REASON_AUTH_KEYGUARD, mUdfpsOverlayControllerCallback);
- mFgExecutor.runAllReady();
- mUdfpsController.dozeTimeTick();
- verify(mUdfpsView).dozeTimeTick();
- }
-
- @Test
- public void onActionDownTouch_whenCanDismissLockScreen_entersDevice() throws RemoteException {
- // GIVEN can dismiss lock screen and the current animation is an UdfpsKeyguardViewController
- when(mKeyguardStateController.canDismissLockScreen()).thenReturn(true);
- when(mUdfpsView.getAnimationViewController()).thenReturn(mUdfpsKeyguardViewController);
-
- final Pair<TouchProcessorResult, TouchProcessorResult> touchProcessorResult =
- givenFingerEvent(InteractionEvent.DOWN, InteractionEvent.UP, false);
-
- // WHEN ACTION_DOWN is received
- when(mSinglePointerTouchProcessor.processTouch(any(), anyInt(), any())).thenReturn(
- touchProcessorResult.first);
- MotionEvent downEvent = obtainMotionEvent(ACTION_DOWN, 0, 0, 0, 0);
- mTouchListenerCaptor.getValue().onTouch(mUdfpsView, downEvent);
- mBiometricExecutor.runAllReady();
- downEvent.recycle();
-
- // THEN notify keyguard authenticate to dismiss the keyguard
- verify(mStatusBarKeyguardViewManager).notifyKeyguardAuthenticated(anyBoolean());
- }
-
- @Test
- public void onActionMoveTouch_whenCanDismissLockScreen_entersDevice() throws RemoteException {
- onActionMoveTouch_whenCanDismissLockScreen_entersDevice(false /* stale */);
- }
-
- @Test
- public void onActionMoveTouch_whenCanDismissLockScreen_entersDevice_ignoreStale()
- throws RemoteException {
- onActionMoveTouch_whenCanDismissLockScreen_entersDevice(true /* stale */);
- }
-
- public void onActionMoveTouch_whenCanDismissLockScreen_entersDevice(boolean stale)
- throws RemoteException {
- // GIVEN can dismiss lock screen and the current animation is an UdfpsKeyguardViewController
- when(mKeyguardStateController.canDismissLockScreen()).thenReturn(true);
- when(mUdfpsView.getAnimationViewController()).thenReturn(mUdfpsKeyguardViewController);
-
- final Pair<TouchProcessorResult, TouchProcessorResult> touchProcessorResult =
- givenFingerEvent(InteractionEvent.DOWN, InteractionEvent.UP, false);
-
- // WHEN ACTION_MOVE is received
- when(mSinglePointerTouchProcessor.processTouch(any(), anyInt(), any())).thenReturn(
- touchProcessorResult.first);
- MotionEvent moveEvent = MotionEvent.obtain(0, 0, MotionEvent.ACTION_MOVE, 0, 0, 0);
- if (stale) {
- mOverlayController.hideUdfpsOverlay(mOpticalProps.sensorId);
- mFgExecutor.runAllReady();
- }
- mTouchListenerCaptor.getValue().onTouch(mUdfpsView, moveEvent);
- mBiometricExecutor.runAllReady();
- moveEvent.recycle();
-
- // THEN notify keyguard authenticate to dismiss the keyguard
- verify(mStatusBarKeyguardViewManager, stale ? never() : times(1))
- .notifyKeyguardAuthenticated(anyBoolean());
- }
-
- @Test
- public void onMultipleTouch_whenCanDismissLockScreen_entersDeviceOnce() throws RemoteException {
- // GIVEN can dismiss lock screen and the current animation is an UdfpsKeyguardViewController
- when(mKeyguardStateController.canDismissLockScreen()).thenReturn(true);
- when(mUdfpsView.getAnimationViewController()).thenReturn(mUdfpsKeyguardViewController);
-
- final Pair<TouchProcessorResult, TouchProcessorResult> touchProcessorResult =
- givenFingerEvent(InteractionEvent.DOWN, InteractionEvent.UNCHANGED, false);
-
- // GIVEN that the overlay is showing
- when(mSinglePointerTouchProcessor.processTouch(any(), anyInt(), any())).thenReturn(
- touchProcessorResult.first);
- MotionEvent downEvent = MotionEvent.obtain(0, 0, ACTION_DOWN, 0, 0, 0);
- mTouchListenerCaptor.getValue().onTouch(mUdfpsView, downEvent);
- mBiometricExecutor.runAllReady();
- downEvent.recycle();
-
- MotionEvent moveEvent = MotionEvent.obtain(0, 0, MotionEvent.ACTION_MOVE, 0, 0, 0);
- when(mSinglePointerTouchProcessor.processTouch(any(), anyInt(), any())).thenReturn(
- touchProcessorResult.second);
- mTouchListenerCaptor.getValue().onTouch(mUdfpsView, moveEvent);
- mBiometricExecutor.runAllReady();
- moveEvent.recycle();
-
- // THEN notify keyguard authenticate to dismiss the keyguard
- verify(mStatusBarKeyguardViewManager).notifyKeyguardAuthenticated(anyBoolean());
- }
-
- @Test
public void hideUdfpsOverlay_resetsAltAuthBouncerWhenShowing() throws RemoteException {
// GIVEN overlay was showing and the udfps bouncer is showing
mOverlayController.showUdfpsOverlay(TEST_REQUEST_ID, mOpticalProps.sensorId,
@@ -524,61 +379,6 @@ public class UdfpsControllerTest extends SysuiTestCase {
}
@Test
- public void updateOverlayParams_recreatesOverlay_ifParamsChanged() throws Exception {
- final Rect[] sensorBounds = new Rect[]{new Rect(10, 10, 20, 20), new Rect(5, 5, 25, 25)};
- final int[] displayWidth = new int[]{1080, 1440};
- final int[] displayHeight = new int[]{1920, 2560};
- final float[] scaleFactor = new float[]{1f, displayHeight[1] / (float) displayHeight[0]};
- final int[] rotation = new int[]{Surface.ROTATION_0, Surface.ROTATION_90};
- final UdfpsOverlayParams oldParams = new UdfpsOverlayParams(sensorBounds[0],
- sensorBounds[0], displayWidth[0], displayHeight[0], scaleFactor[0], rotation[0],
- FingerprintSensorProperties.TYPE_UDFPS_OPTICAL);
-
- for (int i1 = 0; i1 <= 1; ++i1) {
- for (int i2 = 0; i2 <= 1; ++i2) {
- for (int i3 = 0; i3 <= 1; ++i3) {
- for (int i4 = 0; i4 <= 1; ++i4) {
- for (int i5 = 0; i5 <= 1; ++i5) {
- final UdfpsOverlayParams newParams = new UdfpsOverlayParams(
- sensorBounds[i1], sensorBounds[i1], displayWidth[i2],
- displayHeight[i3], scaleFactor[i4], rotation[i5],
- FingerprintSensorProperties.TYPE_UDFPS_OPTICAL);
-
- if (newParams.equals(oldParams)) {
- continue;
- }
-
- // Initialize the overlay with old parameters.
- mUdfpsController.updateOverlayParams(mOpticalProps, oldParams);
-
- // Show the overlay.
- reset(mWindowManager);
- mOverlayController.showUdfpsOverlay(TEST_REQUEST_ID,
- mOpticalProps.sensorId,
- BiometricRequestConstants.REASON_ENROLL_ENROLLING,
- mUdfpsOverlayControllerCallback);
-
- mFgExecutor.runAllReady();
- verify(mWindowManager).addView(mViewCaptor.capture(), any());
- when(mViewCaptor.getValue().getParent())
- .thenReturn(mock(ViewGroup.class));
-
- // Update overlay parameters.
- reset(mWindowManager);
- mUdfpsController.updateOverlayParams(mOpticalProps, newParams);
- mFgExecutor.runAllReady();
-
- // Ensure the overlay was recreated.
- verify(mWindowManager).removeView(any());
- verify(mWindowManager).addView(any(), any());
- }
- }
- }
- }
- }
- }
-
- @Test
public void updateOverlayParams_doesNothing_ifParamsDidntChange() throws Exception {
final Rect sensorBounds = new Rect(10, 10, 20, 20);
final int displayWidth = 1080;
@@ -595,7 +395,6 @@ public class UdfpsControllerTest extends SysuiTestCase {
mOverlayController.showUdfpsOverlay(TEST_REQUEST_ID, mOpticalProps.sensorId,
BiometricRequestConstants.REASON_ENROLL_ENROLLING, mUdfpsOverlayControllerCallback);
mFgExecutor.runAllReady();
- verify(mWindowManager).addView(any(), any());
// Update overlay with the same parameters.
mUdfpsController.updateOverlayParams(mOpticalProps,
@@ -606,870 +405,4 @@ public class UdfpsControllerTest extends SysuiTestCase {
// Ensure the overlay was not recreated.
verify(mWindowManager, never()).removeView(any());
}
-
- private static MotionEvent obtainMotionEvent(int action, float x, float y, float minor,
- float major) {
- MotionEvent.PointerProperties pp = new MotionEvent.PointerProperties();
- pp.id = 1;
- MotionEvent.PointerCoords pc = new MotionEvent.PointerCoords();
- pc.x = x;
- pc.y = y;
- pc.touchMinor = minor;
- pc.touchMajor = major;
- return MotionEvent.obtain(0, 0, action, 1, new MotionEvent.PointerProperties[]{pp},
- new MotionEvent.PointerCoords[]{pc}, 0, 0, 1f, 1f, 0, 0, 0, 0);
- }
-
- private static class TestParams {
- public final FingerprintSensorPropertiesInternal sensorProps;
-
- TestParams(FingerprintSensorPropertiesInternal sensorProps) {
- this.sensorProps = sensorProps;
- }
- }
-
- private void runWithAllParams(ThrowingConsumer<TestParams> testParamsConsumer) {
- for (FingerprintSensorPropertiesInternal sensorProps : List.of(mOpticalProps,
- mUltrasonicProps)) {
- initUdfpsController(sensorProps);
- testParamsConsumer.accept(new TestParams(sensorProps));
- }
- }
-
- @Test
- public void onTouch_propagatesTouchInNativeOrientationAndResolution() {
- runWithAllParams(
- this::onTouch_propagatesTouchInNativeOrientationAndResolutionParameterized);
- }
-
- private void onTouch_propagatesTouchInNativeOrientationAndResolutionParameterized(
- TestParams testParams) throws RemoteException {
- reset(mUdfpsView);
- when(mUdfpsView.getViewRootImpl()).thenReturn(mViewRootImpl);
-
- final Rect sensorBounds = new Rect(1000, 1900, 1080, 1920); // Bottom right corner.
- final int pointerId = 0;
- final int displayWidth = 1080;
- final int displayHeight = 1920;
- final float scaleFactor = 1f; // This means the native resolution is 1440x2560.
- final float touchMinor = 10f;
- final float touchMajor = 20f;
- final float orientation = 30f;
-
- // Expecting a touch at the very bottom right corner in native orientation and resolution.
- final float expectedX = displayWidth / scaleFactor;
- final float expectedY = displayHeight / scaleFactor;
- final float expectedMinor = touchMinor / scaleFactor;
- final float expectedMajor = touchMajor / scaleFactor;
-
- // Configure UdfpsView to accept the ACTION_DOWN event
- when(mUdfpsView.isDisplayConfigured()).thenReturn(false);
-
- // GIVEN a valid touch on sensor
- NormalizedTouchData touchData = new NormalizedTouchData(pointerId, displayWidth,
- displayHeight, touchMinor, touchMajor, orientation, 0L, 0L);
- TouchProcessorResult processorDownResult = new TouchProcessorResult.ProcessedTouch(
- InteractionEvent.DOWN, 1, touchData);
- when(mSinglePointerTouchProcessor.processTouch(any(), anyInt(), any())).thenReturn(
- processorDownResult);
-
- // Show the overlay.
- mOverlayController.showUdfpsOverlay(TEST_REQUEST_ID, testParams.sensorProps.sensorId,
- BiometricRequestConstants.REASON_ENROLL_ENROLLING, mUdfpsOverlayControllerCallback);
- mFgExecutor.runAllReady();
- verify(mUdfpsView).setOnTouchListener(mTouchListenerCaptor.capture());
-
- // Test ROTATION_0
- mUdfpsController.updateOverlayParams(testParams.sensorProps,
- new UdfpsOverlayParams(sensorBounds, sensorBounds, displayWidth, displayHeight,
- scaleFactor, Surface.ROTATION_0,
- FingerprintSensorProperties.TYPE_UDFPS_OPTICAL));
- MotionEvent event = obtainMotionEvent(ACTION_DOWN, displayWidth, displayHeight, touchMinor,
- touchMajor);
- mTouchListenerCaptor.getValue().onTouch(mUdfpsView, event);
- mBiometricExecutor.runAllReady();
- event.recycle();
- verify(mFingerprintManager).onPointerDown(eq(TEST_REQUEST_ID),
- eq(testParams.sensorProps.sensorId), eq(pointerId), eq(expectedX), eq(expectedY),
- eq(expectedMinor), eq(expectedMajor), eq(orientation), anyLong(), anyLong(),
- anyBoolean());
-
- // Test ROTATION_90
- reset(mFingerprintManager);
- mUdfpsController.updateOverlayParams(testParams.sensorProps,
- new UdfpsOverlayParams(sensorBounds, sensorBounds, displayWidth, displayHeight,
- scaleFactor, Surface.ROTATION_90,
- FingerprintSensorProperties.TYPE_UDFPS_OPTICAL));
- event = obtainMotionEvent(ACTION_DOWN, displayHeight, 0, touchMinor, touchMajor);
- mTouchListenerCaptor.getValue().onTouch(mUdfpsView, event);
- mBiometricExecutor.runAllReady();
- event.recycle();
- verify(mFingerprintManager).onPointerDown(eq(TEST_REQUEST_ID),
- eq(testParams.sensorProps.sensorId), eq(pointerId), eq(expectedX), eq(expectedY),
- eq(expectedMinor), eq(expectedMajor), eq(orientation), anyLong(), anyLong(),
- anyBoolean());
-
- // Test ROTATION_270
- reset(mFingerprintManager);
- mUdfpsController.updateOverlayParams(testParams.sensorProps,
- new UdfpsOverlayParams(sensorBounds, sensorBounds, displayWidth, displayHeight,
- scaleFactor, Surface.ROTATION_270,
- FingerprintSensorProperties.TYPE_UDFPS_OPTICAL));
- event = obtainMotionEvent(ACTION_DOWN, 0, displayWidth, touchMinor, touchMajor);
- mTouchListenerCaptor.getValue().onTouch(mUdfpsView, event);
- mBiometricExecutor.runAllReady();
- event.recycle();
- verify(mFingerprintManager).onPointerDown(eq(TEST_REQUEST_ID),
- eq(testParams.sensorProps.sensorId), eq(pointerId), eq(expectedX), eq(expectedY),
- eq(expectedMinor), eq(expectedMajor), eq(orientation), anyLong(), anyLong(),
- anyBoolean());
-
- // Test ROTATION_180
- reset(mFingerprintManager);
- mUdfpsController.updateOverlayParams(testParams.sensorProps,
- new UdfpsOverlayParams(sensorBounds, sensorBounds, displayWidth, displayHeight,
- scaleFactor, Surface.ROTATION_180,
- FingerprintSensorProperties.TYPE_UDFPS_OPTICAL));
- // ROTATION_180 is not supported. It should be treated like ROTATION_0.
- event = obtainMotionEvent(ACTION_DOWN, displayWidth, displayHeight, touchMinor, touchMajor);
- mTouchListenerCaptor.getValue().onTouch(mUdfpsView, event);
- mBiometricExecutor.runAllReady();
- event.recycle();
- verify(mFingerprintManager).onPointerDown(eq(TEST_REQUEST_ID),
- eq(testParams.sensorProps.sensorId), eq(pointerId), eq(expectedX), eq(expectedY),
- eq(expectedMinor), eq(expectedMajor), eq(orientation), anyLong(), anyLong(),
- anyBoolean());
- }
-
- @Test
- public void fingerDown() {
- runWithAllParams(this::fingerDownParameterized);
- }
-
- private void fingerDownParameterized(TestParams testParams) throws RemoteException {
- reset(mUdfpsView, mFingerprintManager, mLatencyTracker,
- mKeyguardUpdateMonitor);
- when(mUdfpsView.getViewRootImpl()).thenReturn(mViewRootImpl);
-
- // Configure UdfpsView to accept the ACTION_DOWN event
- when(mUdfpsView.isDisplayConfigured()).thenReturn(false);
- when(mKeyguardUpdateMonitor.isFingerprintDetectionRunning()).thenReturn(true);
-
- final NormalizedTouchData touchData = new NormalizedTouchData(0, 0f, 0f, 0f, 0f, 0f, 0L,
- 0L);
- final TouchProcessorResult processorResultDown = new TouchProcessorResult.ProcessedTouch(
- InteractionEvent.DOWN, 1 /* pointerId */, touchData);
-
- initUdfpsController(testParams.sensorProps);
- mOverlayController.showUdfpsOverlay(TEST_REQUEST_ID, testParams.sensorProps.sensorId,
- BiometricRequestConstants.REASON_AUTH_KEYGUARD, mUdfpsOverlayControllerCallback);
- mFgExecutor.runAllReady();
-
- // WHEN ACTION_DOWN is received
- verify(mUdfpsView).setOnTouchListener(mTouchListenerCaptor.capture());
- when(mSinglePointerTouchProcessor.processTouch(any(), anyInt(), any())).thenReturn(
- processorResultDown);
- MotionEvent downEvent = MotionEvent.obtain(0, 0, ACTION_DOWN, 0, 0, 0);
- mTouchListenerCaptor.getValue().onTouch(mUdfpsView, downEvent);
- mBiometricExecutor.runAllReady();
- downEvent.recycle();
-
- // THEN the touch provider is notified about onPointerDown.
- verify(mFingerprintManager).onPointerDown(anyLong(), anyInt(), anyInt(), anyFloat(),
- anyFloat(), anyFloat(), anyFloat(), anyFloat(), anyLong(), anyLong(), anyBoolean());
-
- // AND display configuration begins
- if (testParams.sensorProps.sensorType == FingerprintSensorProperties.TYPE_UDFPS_OPTICAL) {
- verify(mLatencyTracker).onActionStart(eq(LatencyTracker.ACTION_UDFPS_ILLUMINATE));
- verify(mUdfpsView).configureDisplay(mOnDisplayConfiguredCaptor.capture());
- } else {
- verify(mLatencyTracker, never()).onActionStart(
- eq(LatencyTracker.ACTION_UDFPS_ILLUMINATE));
- verify(mUdfpsView, never()).configureDisplay(any());
- }
- verify(mLatencyTracker, never()).onActionEnd(eq(LatencyTracker.ACTION_UDFPS_ILLUMINATE));
-
- if (testParams.sensorProps.sensorType == FingerprintSensorProperties.TYPE_UDFPS_OPTICAL) {
- // AND onDisplayConfigured notifies FingerprintManager about onUiReady
- mOnDisplayConfiguredCaptor.getValue().run();
- mBiometricExecutor.runAllReady();
- InOrder inOrder = inOrder(mFingerprintManager, mLatencyTracker);
- inOrder.verify(mFingerprintManager).onUdfpsUiEvent(
- eq(FingerprintManager.UDFPS_UI_READY), eq(TEST_REQUEST_ID),
- eq(testParams.sensorProps.sensorId));
- inOrder.verify(mLatencyTracker).onActionEnd(
- eq(LatencyTracker.ACTION_UDFPS_ILLUMINATE));
- } else {
- verify(mFingerprintManager, never()).onUdfpsUiEvent(
- eq(FingerprintManager.UDFPS_UI_READY), anyLong(), anyInt());
- verify(mLatencyTracker, never()).onActionEnd(
- eq(LatencyTracker.ACTION_UDFPS_ILLUMINATE));
- }
- }
-
- @Test
- public void aodInterrupt() {
- runWithAllParams(this::aodInterruptParameterized);
- }
-
- private void aodInterruptParameterized(TestParams testParams) throws RemoteException {
- mUdfpsController.cancelAodSendFingerUpAction();
- reset(mUdfpsView, mFingerprintManager, mKeyguardUpdateMonitor);
- when(mKeyguardUpdateMonitor.isFingerprintDetectionRunning()).thenReturn(true);
- when(mUdfpsView.getViewRootImpl()).thenReturn(mViewRootImpl);
-
- // GIVEN that the overlay is showing and screen is on and fp is running
- mOverlayController.showUdfpsOverlay(TEST_REQUEST_ID, testParams.sensorProps.sensorId,
- BiometricRequestConstants.REASON_AUTH_KEYGUARD, mUdfpsOverlayControllerCallback);
- mScreenObserver.onScreenTurnedOn();
- mFgExecutor.runAllReady();
- // WHEN fingerprint is requested because of AOD interrupt
- mUdfpsController.onAodInterrupt(0, 0, 2f, 3f);
- mFgExecutor.runAllReady();
- if (testParams.sensorProps.sensorType == FingerprintSensorProperties.TYPE_UDFPS_OPTICAL) {
- // THEN display configuration begins
- // AND onDisplayConfigured notifies FingerprintManager about onUiReady
- verify(mUdfpsView).configureDisplay(mOnDisplayConfiguredCaptor.capture());
- mOnDisplayConfiguredCaptor.getValue().run();
- } else {
- verify(mUdfpsView, never()).configureDisplay(mOnDisplayConfiguredCaptor.capture());
- }
- mBiometricExecutor.runAllReady();
-
- verify(mFingerprintManager).onPointerDown(anyLong(), anyInt(), anyInt(), anyFloat(),
- anyFloat(), anyFloat(), anyFloat(), anyFloat(), anyLong(), anyLong(), anyBoolean());
- }
-
- @Test
- public void tryAodSendFingerUp_displayConfigurationChanges() {
- runWithAllParams(this::cancelAodInterruptParameterized);
- }
-
- private void cancelAodInterruptParameterized(TestParams testParams) throws RemoteException {
- reset(mUdfpsView);
-
- // GIVEN AOD interrupt
- mOverlayController.showUdfpsOverlay(TEST_REQUEST_ID, testParams.sensorProps.sensorId,
- BiometricRequestConstants.REASON_AUTH_KEYGUARD, mUdfpsOverlayControllerCallback);
- mScreenObserver.onScreenTurnedOn();
- mFgExecutor.runAllReady();
- mUdfpsController.onAodInterrupt(0, 0, 0f, 0f);
- if (testParams.sensorProps.sensorType == FingerprintSensorProperties.TYPE_UDFPS_OPTICAL) {
- when(mUdfpsView.isDisplayConfigured()).thenReturn(true);
- // WHEN it is cancelled
- mUdfpsController.tryAodSendFingerUp();
- // THEN the display is unconfigured
- verify(mUdfpsView).unconfigureDisplay();
- } else {
- when(mUdfpsView.isDisplayConfigured()).thenReturn(false);
- // WHEN it is cancelled
- mUdfpsController.tryAodSendFingerUp();
- // THEN the display configuration is unchanged.
- verify(mUdfpsView, never()).unconfigureDisplay();
- }
- }
-
- @Test
- public void onFingerUp_displayConfigurationChange() {
- runWithAllParams(this::onFingerUp_displayConfigurationParameterized);
- }
-
- private void onFingerUp_displayConfigurationParameterized(TestParams testParams)
- throws RemoteException {
- reset(mUdfpsView);
- when(mUdfpsView.getViewRootImpl()).thenReturn(mViewRootImpl);
-
- final Pair<TouchProcessorResult, TouchProcessorResult> touchProcessorResult =
- givenFingerEvent(InteractionEvent.DOWN, InteractionEvent.UP, false);
-
- // GIVEN AOD interrupt
- mScreenObserver.onScreenTurnedOn();
- mFgExecutor.runAllReady();
- mUdfpsController.onAodInterrupt(0, 0, 0f, 0f);
- if (testParams.sensorProps.sensorType == FingerprintSensorProperties.TYPE_UDFPS_OPTICAL) {
- when(mUdfpsView.isDisplayConfigured()).thenReturn(true);
-
- // WHEN up-action received
- when(mSinglePointerTouchProcessor.processTouch(any(), anyInt(), any())).thenReturn(
- touchProcessorResult.second);
- MotionEvent upEvent = MotionEvent.obtain(0, 0, ACTION_UP, 0, 0, 0);
- mTouchListenerCaptor.getValue().onTouch(mUdfpsView, upEvent);
- mBiometricExecutor.runAllReady();
- upEvent.recycle();
- mFgExecutor.runAllReady();
-
- // THEN the display is unconfigured
- verify(mUdfpsView).unconfigureDisplay();
- } else {
- when(mUdfpsView.isDisplayConfigured()).thenReturn(false);
-
- // WHEN up-action received
- when(mSinglePointerTouchProcessor.processTouch(any(), anyInt(), any())).thenReturn(
- touchProcessorResult.second);
- MotionEvent upEvent = MotionEvent.obtain(0, 0, ACTION_UP, 0, 0, 0);
- mTouchListenerCaptor.getValue().onTouch(mUdfpsView, upEvent);
- mBiometricExecutor.runAllReady();
- upEvent.recycle();
- mFgExecutor.runAllReady();
-
- // THEN the display configuration is unchanged.
- verify(mUdfpsView, never()).unconfigureDisplay();
- }
- }
-
- @Test
- public void onAcquiredGood_displayConfigurationChange() {
- runWithAllParams(this::onAcquiredGood_displayConfigurationParameterized);
- }
-
- private void onAcquiredGood_displayConfigurationParameterized(TestParams testParams)
- throws RemoteException {
- reset(mUdfpsView);
-
- // GIVEN overlay is showing
- mOverlayController.showUdfpsOverlay(TEST_REQUEST_ID, testParams.sensorProps.sensorId,
- BiometricRequestConstants.REASON_AUTH_KEYGUARD, mUdfpsOverlayControllerCallback);
- mFgExecutor.runAllReady();
- if (testParams.sensorProps.sensorType == FingerprintSensorProperties.TYPE_UDFPS_OPTICAL) {
- when(mUdfpsView.isDisplayConfigured()).thenReturn(true);
- // WHEN ACQUIRED_GOOD received
- mOverlayController.onAcquired(testParams.sensorProps.sensorId,
- BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_GOOD);
- mFgExecutor.runAllReady();
- // THEN the display is unconfigured
- verify(mUdfpsView).unconfigureDisplay();
- } else {
- when(mUdfpsView.isDisplayConfigured()).thenReturn(false);
- // WHEN ACQUIRED_GOOD received
- mOverlayController.onAcquired(testParams.sensorProps.sensorId,
- BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_GOOD);
- mFgExecutor.runAllReady();
- // THEN the display configuration is unchanged.
- verify(mUdfpsView, never()).unconfigureDisplay();
- }
- }
-
- @Test
- public void aodInterruptTimeout() {
- runWithAllParams(this::aodInterruptTimeoutParameterized);
- }
-
- private void aodInterruptTimeoutParameterized(TestParams testParams) throws RemoteException {
- reset(mUdfpsView);
-
- // GIVEN AOD interrupt
- mOverlayController.showUdfpsOverlay(TEST_REQUEST_ID, testParams.sensorProps.sensorId,
- BiometricRequestConstants.REASON_AUTH_KEYGUARD, mUdfpsOverlayControllerCallback);
- mScreenObserver.onScreenTurnedOn();
- mFgExecutor.runAllReady();
- mUdfpsController.onAodInterrupt(0, 0, 0f, 0f);
- mFgExecutor.runAllReady();
- if (testParams.sensorProps.sensorType == FingerprintSensorProperties.TYPE_UDFPS_OPTICAL) {
- when(mUdfpsView.isDisplayConfigured()).thenReturn(true);
- } else {
- when(mUdfpsView.isDisplayConfigured()).thenReturn(false);
- }
- // WHEN it times out
- mFgExecutor.advanceClockToNext();
- mFgExecutor.runAllReady();
- if (testParams.sensorProps.sensorType == FingerprintSensorProperties.TYPE_UDFPS_OPTICAL) {
- // THEN the display is unconfigured.
- verify(mUdfpsView).unconfigureDisplay();
- } else {
- // THEN the display configuration is unchanged.
- verify(mUdfpsView, never()).unconfigureDisplay();
- }
- }
-
- @Test
- public void aodInterruptCancelTimeoutActionOnFingerUp() {
- runWithAllParams(this::aodInterruptCancelTimeoutActionOnFingerUpParameterized);
- }
-
- private void aodInterruptCancelTimeoutActionOnFingerUpParameterized(TestParams testParams)
- throws RemoteException {
- reset(mUdfpsView);
- when(mUdfpsView.getViewRootImpl()).thenReturn(mViewRootImpl);
-
- // GIVEN AOD interrupt
- mScreenObserver.onScreenTurnedOn();
- mFgExecutor.runAllReady();
- mUdfpsController.onAodInterrupt(0, 0, 0f, 0f);
- mFgExecutor.runAllReady();
-
- final Pair<TouchProcessorResult, TouchProcessorResult> touchProcessorResult =
- givenFingerEvent(InteractionEvent.DOWN, InteractionEvent.UP, false);
- mOverlayController.showUdfpsOverlay(TEST_REQUEST_ID, testParams.sensorProps.sensorId,
- BiometricRequestConstants.REASON_AUTH_KEYGUARD, mUdfpsOverlayControllerCallback);
-
- if (testParams.sensorProps.sensorType == FingerprintSensorProperties.TYPE_UDFPS_OPTICAL) {
- // Configure UdfpsView to accept the ACTION_UP event
- when(mUdfpsView.isDisplayConfigured()).thenReturn(true);
- } else {
- when(mUdfpsView.isDisplayConfigured()).thenReturn(false);
- }
-
- // WHEN ACTION_UP is received
- when(mSinglePointerTouchProcessor.processTouch(any(), anyInt(), any())).thenReturn(
- touchProcessorResult.second);
- MotionEvent upEvent = MotionEvent.obtain(0, 0, ACTION_UP, 0, 0, 0);
- mTouchListenerCaptor.getValue().onTouch(mUdfpsView, upEvent);
- mBiometricExecutor.runAllReady();
- upEvent.recycle();
-
- // Configure UdfpsView to accept the ACTION_DOWN event
- when(mUdfpsView.isDisplayConfigured()).thenReturn(false);
-
- // WHEN ACTION_DOWN is received
- when(mSinglePointerTouchProcessor.processTouch(any(), anyInt(), any())).thenReturn(
- touchProcessorResult.first);
- MotionEvent downEvent = MotionEvent.obtain(0, 0, ACTION_DOWN, 0, 0, 0);
- mTouchListenerCaptor.getValue().onTouch(mUdfpsView, downEvent);
- mBiometricExecutor.runAllReady();
- downEvent.recycle();
-
- mFgExecutor.runAllReady();
-
- if (testParams.sensorProps.sensorType == FingerprintSensorProperties.TYPE_UDFPS_OPTICAL) {
- // Configure UdfpsView to accept the finger up event
- when(mUdfpsView.isDisplayConfigured()).thenReturn(true);
- } else {
- when(mUdfpsView.isDisplayConfigured()).thenReturn(false);
- }
-
- // WHEN it times out
- mFgExecutor.advanceClockToNext();
- mFgExecutor.runAllReady();
-
- if (testParams.sensorProps.sensorType == FingerprintSensorProperties.TYPE_UDFPS_OPTICAL) {
- // THEN the display should be unconfigured once. If the timeout action is not
- // cancelled, the display would be unconfigured twice which would cause two
- // FP attempts.
- verify(mUdfpsView).unconfigureDisplay();
- } else {
- verify(mUdfpsView, never()).unconfigureDisplay();
- }
- }
-
- @Test
- public void aodInterruptScreenOff() {
- runWithAllParams(this::aodInterruptScreenOffParameterized);
- }
-
- private void aodInterruptScreenOffParameterized(TestParams testParams) throws RemoteException {
- reset(mUdfpsView);
-
- // GIVEN screen off
- mOverlayController.showUdfpsOverlay(TEST_REQUEST_ID, testParams.sensorProps.sensorId,
- BiometricRequestConstants.REASON_AUTH_KEYGUARD, mUdfpsOverlayControllerCallback);
- mScreenObserver.onScreenTurnedOff();
- mFgExecutor.runAllReady();
-
- // WHEN aod interrupt is received
- mUdfpsController.onAodInterrupt(0, 0, 0f, 0f);
-
- // THEN display doesn't get configured because it's off
- verify(mUdfpsView, never()).configureDisplay(any());
- }
-
- @Test
- public void aodInterrupt_fingerprintNotRunning() {
- runWithAllParams(this::aodInterrupt_fingerprintNotRunningParameterized);
- }
-
- private void aodInterrupt_fingerprintNotRunningParameterized(TestParams testParams)
- throws RemoteException {
- reset(mUdfpsView);
-
- // GIVEN showing overlay
- mOverlayController.showUdfpsOverlay(TEST_REQUEST_ID, testParams.sensorProps.sensorId,
- BiometricRequestConstants.REASON_AUTH_KEYGUARD, mUdfpsOverlayControllerCallback);
- mScreenObserver.onScreenTurnedOn();
- mFgExecutor.runAllReady();
-
- // WHEN aod interrupt is received when the fingerprint service isn't running
- when(mKeyguardUpdateMonitor.isFingerprintDetectionRunning()).thenReturn(false);
- mUdfpsController.onAodInterrupt(0, 0, 0f, 0f);
-
- // THEN display doesn't get configured because it's off
- verify(mUdfpsView, never()).configureDisplay(any());
- }
-
- @Test
- public void playHapticOnTouchUdfpsArea_a11yTouchExplorationEnabled() throws RemoteException {
- final Pair<TouchProcessorResult, TouchProcessorResult> touchProcessorResult =
- givenFingerEvent(InteractionEvent.DOWN, InteractionEvent.UP, true);
-
- // WHEN ACTION_HOVER is received
- when(mSinglePointerTouchProcessor.processTouch(any(), anyInt(), any())).thenReturn(
- touchProcessorResult.first);
- verify(mUdfpsView).setOnHoverListener(mHoverListenerCaptor.capture());
- MotionEvent enterEvent = MotionEvent.obtain(0, 0, MotionEvent.ACTION_HOVER_ENTER, 0, 0, 0);
- mHoverListenerCaptor.getValue().onHover(mUdfpsView, enterEvent);
- enterEvent.recycle();
-
- // THEN context click haptic is played
- verify(mVibrator).performHapticFeedback(
- any(),
- eq(HapticFeedbackConstants.CONTEXT_CLICK)
- );
- }
-
- @Test
- public void noHapticOnTouchUdfpsArea_a11yTouchExplorationDisabled() throws RemoteException {
- final Pair<TouchProcessorResult, TouchProcessorResult> touchProcessorResult =
- givenFingerEvent(InteractionEvent.DOWN, InteractionEvent.UP, false);
-
- // WHEN ACTION_DOWN is received
- when(mSinglePointerTouchProcessor.processTouch(any(), anyInt(), any())).thenReturn(
- touchProcessorResult.first);
- MotionEvent downEvent = MotionEvent.obtain(0, 0, ACTION_DOWN, 0, 0, 0);
- mTouchListenerCaptor.getValue().onTouch(mUdfpsView, downEvent);
- mBiometricExecutor.runAllReady();
- downEvent.recycle();
-
- // THEN NO haptic played
- verify(mVibrator, never()).performHapticFeedback(any(), anyInt());
- }
-
- @Test
- public void fingerDown_falsingManagerInformed() throws RemoteException {
- final Pair<TouchProcessorResult, TouchProcessorResult> touchProcessorResult =
- givenFingerEvent(InteractionEvent.DOWN, InteractionEvent.UP, false);
-
- // WHEN ACTION_DOWN is received
- when(mSinglePointerTouchProcessor.processTouch(any(), anyInt(), any())).thenReturn(
- touchProcessorResult.first);
- MotionEvent downEvent = MotionEvent.obtain(0, 0, ACTION_DOWN, 0, 0, 0);
- mTouchListenerCaptor.getValue().onTouch(mUdfpsView, downEvent);
- mBiometricExecutor.runAllReady();
- downEvent.recycle();
-
- // THEN falsing manager is informed of the touch
- verify(mFalsingManager).isFalseTouch(UDFPS_AUTHENTICATION);
- }
-
- private Pair<TouchProcessorResult, TouchProcessorResult> givenFingerEvent(
- InteractionEvent event1, InteractionEvent event2, boolean a11y)
- throws RemoteException {
- final NormalizedTouchData touchData = new NormalizedTouchData(0, 0f, 0f, 0f, 0f, 0f, 0L,
- 0L);
- final TouchProcessorResult processorResultDown = new TouchProcessorResult.ProcessedTouch(
- event1, 1 /* pointerId */, touchData);
- final TouchProcessorResult processorResultUp = new TouchProcessorResult.ProcessedTouch(
- event2, 1 /* pointerId */, touchData);
-
- // Configure UdfpsController to use FingerprintManager as opposed to AlternateTouchProvider.
- initUdfpsController(mOpticalProps);
-
- // Configure UdfpsView to accept the ACTION_DOWN event
- when(mUdfpsView.isDisplayConfigured()).thenReturn(false);
-
- // GIVEN that the overlay is showing and a11y touch exploration NOT enabled
- when(mAccessibilityManager.isTouchExplorationEnabled()).thenReturn(a11y);
- mOverlayController.showUdfpsOverlay(TEST_REQUEST_ID, mOpticalProps.sensorId,
- BiometricRequestConstants.REASON_AUTH_KEYGUARD, mUdfpsOverlayControllerCallback);
- mFgExecutor.runAllReady();
-
- if (a11y) {
- verify(mUdfpsView).setOnHoverListener(mHoverListenerCaptor.capture());
- } else {
- verify(mUdfpsView).setOnTouchListener(mTouchListenerCaptor.capture());
- }
-
- return new Pair<>(processorResultDown, processorResultUp);
- }
-
- @Test
- public void onTouch_forwardToKeyguard() throws RemoteException {
- final NormalizedTouchData touchData = new NormalizedTouchData(0, 0f, 0f, 0f, 0f, 0f, 0L,
- 0L);
- final TouchProcessorResult processorResultDown = new TouchProcessorResult.ProcessedTouch(
- InteractionEvent.UNCHANGED, -1 /* pointerOnSensorId */, touchData);
-
- // GIVEN that the overlay is showing and a11y touch exploration NOT enabled
- when(mAlternateBouncerInteractor.isVisibleState()).thenReturn(true);
- mOverlayController.showUdfpsOverlay(TEST_REQUEST_ID, mOpticalProps.sensorId,
- BiometricRequestConstants.REASON_AUTH_KEYGUARD, mUdfpsOverlayControllerCallback);
- mFgExecutor.runAllReady();
-
- verify(mUdfpsView).setOnTouchListener(mTouchListenerCaptor.capture());
-
- // WHEN ACTION_DOWN is received
- when(mSinglePointerTouchProcessor.processTouch(any(), anyInt(), any())).thenReturn(
- processorResultDown);
- MotionEvent downEvent = MotionEvent.obtain(0, 0, ACTION_DOWN, 0, 0, 0);
- mTouchListenerCaptor.getValue().onTouch(mUdfpsView, downEvent);
- mBiometricExecutor.runAllReady();
-
- // THEN the touch is forwarded to Keyguard
- verify(mStatusBarKeyguardViewManager).onTouch(downEvent);
- }
-
- @Test
- public void onTouch_pilferPointer() throws RemoteException {
- final Pair<TouchProcessorResult, TouchProcessorResult> touchProcessorResult =
- givenFingerEvent(InteractionEvent.DOWN, InteractionEvent.UNCHANGED, false);
-
- // WHEN ACTION_DOWN is received
- when(mSinglePointerTouchProcessor.processTouch(any(), anyInt(), any())).thenReturn(
- touchProcessorResult.first);
- MotionEvent event = MotionEvent.obtain(0, 0, ACTION_DOWN, 0, 0, 0);
- mTouchListenerCaptor.getValue().onTouch(mUdfpsView, event);
- mBiometricExecutor.runAllReady();
-
- // WHEN ACTION_MOVE is received after
- when(mSinglePointerTouchProcessor.processTouch(any(), anyInt(), any())).thenReturn(
- touchProcessorResult.second);
- event.setAction(ACTION_MOVE);
- mTouchListenerCaptor.getValue().onTouch(mUdfpsView, event);
- mBiometricExecutor.runAllReady();
- event.recycle();
-
- // THEN only pilfer once on the initial down
- verify(mInputManager).pilferPointers(any());
- }
-
- @Test
- public void onTouch_doNotPilferPointer() throws RemoteException {
- final NormalizedTouchData touchData = new NormalizedTouchData(0, 0f, 0f, 0f, 0f, 0f, 0L,
- 0L);
- final TouchProcessorResult processorResultUnchanged =
- new TouchProcessorResult.ProcessedTouch(InteractionEvent.UNCHANGED,
- -1 /* pointerId */, touchData);
-
- mOverlayController.showUdfpsOverlay(TEST_REQUEST_ID, mOpticalProps.sensorId,
- BiometricRequestConstants.REASON_AUTH_KEYGUARD, mUdfpsOverlayControllerCallback);
- mFgExecutor.runAllReady();
-
- verify(mUdfpsView).setOnTouchListener(mTouchListenerCaptor.capture());
-
- // WHEN ACTION_DOWN is received and touch is not within sensor
- when(mSinglePointerTouchProcessor.processTouch(any(), anyInt(), any())).thenReturn(
- processorResultUnchanged);
- MotionEvent downEvent = MotionEvent.obtain(0, 0, ACTION_DOWN, 0, 0, 0);
- mTouchListenerCaptor.getValue().onTouch(mUdfpsView, downEvent);
- mBiometricExecutor.runAllReady();
- downEvent.recycle();
-
- // THEN the touch is NOT pilfered
- verify(mInputManager, never()).pilferPointers(any());
- }
-
- @Test
- public void onDownTouchReceivedWithoutPreviousUp() throws RemoteException {
- final NormalizedTouchData touchData = new NormalizedTouchData(0, 0f, 0f, 0f, 0f, 0f, 0L,
- 0L);
- final TouchProcessorResult processorResultDown =
- new TouchProcessorResult.ProcessedTouch(InteractionEvent.DOWN,
- -1 /* pointerId */, touchData);
-
- mOverlayController.showUdfpsOverlay(TEST_REQUEST_ID, mOpticalProps.sensorId,
- BiometricRequestConstants.REASON_AUTH_KEYGUARD, mUdfpsOverlayControllerCallback);
- mFgExecutor.runAllReady();
-
- verify(mUdfpsView).setOnTouchListener(mTouchListenerCaptor.capture());
-
- // WHEN ACTION_DOWN is received and touch is within sensor
- when(mSinglePointerTouchProcessor.processTouch(any(), anyInt(), any())).thenReturn(
- processorResultDown);
- MotionEvent firstDownEvent = MotionEvent.obtain(0, 0, ACTION_DOWN, 0, 0, 0);
- mTouchListenerCaptor.getValue().onTouch(mUdfpsView, firstDownEvent);
- mBiometricExecutor.runAllReady();
- firstDownEvent.recycle();
-
- // And another ACTION_DOWN is received without an ACTION_UP before
- MotionEvent secondDownEvent = MotionEvent.obtain(0, 0, ACTION_DOWN, 0, 0, 0);
- mTouchListenerCaptor.getValue().onTouch(mUdfpsView, secondDownEvent);
- mBiometricExecutor.runAllReady();
- secondDownEvent.recycle();
-
- // THEN the touch is still processed
- verify(mFingerprintManager, times(2)).onPointerDown(anyLong(), anyInt(), anyInt(),
- anyFloat(), anyFloat(), anyFloat(), anyFloat(), anyFloat(), anyLong(), anyLong(),
- anyBoolean());
- }
-
- @Test
- public void onAodDownAndDownTouchReceived() throws RemoteException {
- final NormalizedTouchData touchData = new NormalizedTouchData(0, 0f, 0f, 0f, 0f, 0f, 0L,
- 0L);
- final TouchProcessorResult processorResultDown =
- new TouchProcessorResult.ProcessedTouch(InteractionEvent.DOWN,
- -1 /* pointerId */, touchData);
-
- mOverlayController.showUdfpsOverlay(TEST_REQUEST_ID, mOpticalProps.sensorId,
- BiometricRequestConstants.REASON_AUTH_KEYGUARD, mUdfpsOverlayControllerCallback);
- mFgExecutor.runAllReady();
-
- verify(mUdfpsView).setOnTouchListener(mTouchListenerCaptor.capture());
-
- // WHEN fingerprint is requested because of AOD interrupt
- // GIVEN there's been an AoD interrupt
- when(mKeyguardUpdateMonitor.isFingerprintDetectionRunning()).thenReturn(true);
- mScreenObserver.onScreenTurnedOn();
- mUdfpsController.onAodInterrupt(0, 0, 0, 0);
- mFgExecutor.runAllReady();
-
- // and an ACTION_DOWN is received and touch is within sensor
- when(mSinglePointerTouchProcessor.processTouch(any(), anyInt(), any())).thenReturn(
- processorResultDown);
- MotionEvent firstDownEvent = MotionEvent.obtain(0, 0, ACTION_DOWN, 0, 0, 0);
- mTouchListenerCaptor.getValue().onTouch(mUdfpsView, firstDownEvent);
- mBiometricExecutor.runAllReady();
- firstDownEvent.recycle();
-
- // THEN the touch is only processed once
- verify(mFingerprintManager).onPointerDown(anyLong(), anyInt(), anyInt(),
- anyFloat(), anyFloat(), anyFloat(), anyFloat(), anyFloat(), anyLong(), anyLong(),
- anyBoolean());
- }
-
- @Test
- public void onTouch_pilferPointerWhenAltBouncerShowing()
- throws RemoteException {
- final Pair<TouchProcessorResult, TouchProcessorResult> touchProcessorResult =
- givenFingerEvent(InteractionEvent.UNCHANGED, InteractionEvent.UP, false);
-
- // WHEN alternate bouncer is showing
- when(mAlternateBouncerInteractor.isVisibleState()).thenReturn(true);
-
- // WHEN ACTION_DOWN is received and touch is not within sensor
- when(mSinglePointerTouchProcessor.processTouch(any(), anyInt(), any())).thenReturn(
- touchProcessorResult.first);
- MotionEvent downEvent = MotionEvent.obtain(0, 0, ACTION_DOWN, 0, 0, 0);
- mTouchListenerCaptor.getValue().onTouch(mUdfpsView, downEvent);
- mBiometricExecutor.runAllReady();
- downEvent.recycle();
-
- // THEN the touch is pilfered
- verify(mInputManager).pilferPointers(any());
- }
-
- @Test
- public void onTouch_doNotProcessTouchWhenPullingUpBouncer()
- throws RemoteException {
- final Pair<TouchProcessorResult, TouchProcessorResult> touchProcessorResult =
- givenFingerEvent(InteractionEvent.UNCHANGED, InteractionEvent.UP, false);
-
- // GIVEN a swipe up to bring up primary bouncer is in progress or swipe down for QS
- when(mPrimaryBouncerInteractor.isInTransit()).thenReturn(true);
- when(mLockscreenShadeTransitionController.getFractionToShade()).thenReturn(1f);
-
- // WHEN ACTION_MOVE is received and touch is within sensor
- when(mSinglePointerTouchProcessor.processTouch(any(), anyInt(), any())).thenReturn(
- touchProcessorResult.first);
- MotionEvent moveEvent = MotionEvent.obtain(0, 0, ACTION_MOVE, 0, 0, 0);
- mTouchListenerCaptor.getValue().onTouch(mUdfpsView, moveEvent);
- mBiometricExecutor.runAllReady();
- moveEvent.recycle();
-
- // THEN the touch is NOT processed
- verify(mFingerprintManager, never()).onPointerDown(anyLong(), anyInt(), anyInt(),
- anyFloat(), anyFloat(), anyFloat(), anyFloat(), anyFloat(), anyLong(), anyLong(),
- anyBoolean());
- }
-
-
- @Test
- public void onTouch_qsDrag_processesTouchWhenAlternateBouncerVisible()
- throws RemoteException {
- final Pair<TouchProcessorResult, TouchProcessorResult> touchProcessorResult =
- givenFingerEvent(InteractionEvent.DOWN, InteractionEvent.UP, false);
-
- when(mAlternateBouncerInteractor.isVisibleState()).thenReturn(true);
- // GIVEN swipe down for QS
- when(mPrimaryBouncerInteractor.isInTransit()).thenReturn(false);
- when(mLockscreenShadeTransitionController.getQSDragProgress()).thenReturn(1f);
-
- // WHEN ACTION_MOVE is received and touch is within sensor
- when(mSinglePointerTouchProcessor.processTouch(any(), anyInt(), any())).thenReturn(
- touchProcessorResult.first);
- MotionEvent moveEvent = MotionEvent.obtain(0, 0, ACTION_MOVE, 0, 0, 0);
- mTouchListenerCaptor.getValue().onTouch(mUdfpsView, moveEvent);
- mBiometricExecutor.runAllReady();
- moveEvent.recycle();
-
- // THEN the touch is still processed
- verify(mFingerprintManager).onPointerDown(anyLong(), anyInt(), anyInt(),
- anyFloat(), anyFloat(), anyFloat(), anyFloat(), anyFloat(), anyLong(), anyLong(),
- anyBoolean());
- }
-
- @Test
- public void onAodInterrupt_onAcquiredGood_fingerNoLongerDown() throws RemoteException {
- // GIVEN UDFPS overlay is showing
- mOverlayController.showUdfpsOverlay(TEST_REQUEST_ID, mOpticalProps.sensorId,
- BiometricRequestConstants.REASON_AUTH_KEYGUARD, mUdfpsOverlayControllerCallback);
- mFgExecutor.runAllReady();
-
- // GIVEN there's been an AoD interrupt
- when(mKeyguardUpdateMonitor.isFingerprintDetectionRunning()).thenReturn(true);
- mScreenObserver.onScreenTurnedOn();
- mUdfpsController.onAodInterrupt(0, 0, 0, 0);
-
- // THEN finger is considered down
- assertTrue(mUdfpsController.isFingerDown());
-
- // WHEN udfps receives an ACQUIRED_GOOD after the display is configured
- when(mUdfpsView.isDisplayConfigured()).thenReturn(true);
- verify(mFingerprintManager).setUdfpsOverlayController(
- mUdfpsOverlayControllerCaptor.capture());
- mUdfpsOverlayControllerCaptor.getValue().onAcquired(0, FINGERPRINT_ACQUIRED_GOOD);
- mFgExecutor.runAllReady();
-
- // THEN is fingerDown should be FALSE
- assertFalse(mUdfpsController.isFingerDown());
- }
-
- @Test
- public void playHaptic_onAodInterrupt_onAcquiredBad_performHapticFeedback()
- throws RemoteException {
- // GIVEN UDFPS overlay is showing
- mOverlayController.showUdfpsOverlay(TEST_REQUEST_ID, mOpticalProps.sensorId,
- BiometricRequestConstants.REASON_AUTH_KEYGUARD, mUdfpsOverlayControllerCallback);
- mFgExecutor.runAllReady();
-
- // GIVEN there's been an AoD interrupt
- when(mKeyguardUpdateMonitor.isFingerprintDetectionRunning()).thenReturn(false);
- mScreenObserver.onScreenTurnedOn();
- mUdfpsController.onAodInterrupt(0, 0, 0, 0);
-
- // THEN vibrate is used
- verify(mVibrator).performHapticFeedback(any(), eq(UdfpsController.LONG_PRESS));
- }
-
- @Test
- public void onAcquiredCalbacks() {
- runWithAllParams(
- this::ultrasonicCallbackOnAcquired);
- }
-
- public void ultrasonicCallbackOnAcquired(TestParams testParams) throws RemoteException{
- if (testParams.sensorProps.sensorType
- == FingerprintSensorProperties.TYPE_UDFPS_ULTRASONIC) {
- reset(mUdfpsView);
-
- UdfpsController.Callback callbackMock = mock(UdfpsController.Callback.class);
- mUdfpsController.addCallback(callbackMock);
-
- // GIVEN UDFPS overlay is showing
- mOverlayController.showUdfpsOverlay(TEST_REQUEST_ID, mOpticalProps.sensorId,
- BiometricRequestConstants.REASON_AUTH_KEYGUARD,
- mUdfpsOverlayControllerCallback);
- mFgExecutor.runAllReady();
-
- verify(mFingerprintManager).setUdfpsOverlayController(
- mUdfpsOverlayControllerCaptor.capture());
- mUdfpsOverlayControllerCaptor.getValue().onAcquired(0, FINGERPRINT_ACQUIRED_START);
- mFgExecutor.runAllReady();
-
- verify(callbackMock).onFingerDown();
-
- mUdfpsOverlayControllerCaptor.getValue().onAcquired(0, FINGERPRINT_ACQUIRED_GOOD);
- mFgExecutor.runAllReady();
-
- verify(callbackMock).onFingerUp();
- }
- }
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerBaseTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerBaseTest.java
deleted file mode 100644
index 7986051de3e0..000000000000
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerBaseTest.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Copyright (C) 2020 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 com.android.systemui.biometrics;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-
-import com.android.keyguard.KeyguardUpdateMonitor;
-import com.android.systemui.Flags;
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.animation.ActivityTransitionAnimator;
-import com.android.systemui.biometrics.domain.interactor.UdfpsOverlayInteractor;
-import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor;
-import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor;
-import com.android.systemui.dump.DumpManager;
-import com.android.systemui.flags.FakeFeatureFlags;
-import com.android.systemui.keyguard.KeyguardViewMediator;
-import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor;
-import com.android.systemui.plugins.statusbar.StatusBarStateController;
-import com.android.systemui.shade.ShadeExpansionChangeEvent;
-import com.android.systemui.shade.ShadeExpansionStateManager;
-import com.android.systemui.shade.domain.interactor.ShadeInteractor;
-import com.android.systemui.statusbar.LockscreenShadeTransitionController;
-import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
-import com.android.systemui.statusbar.phone.SystemUIDialogManager;
-import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController;
-import com.android.systemui.statusbar.policy.ConfigurationController;
-import com.android.systemui.statusbar.policy.KeyguardStateController;
-import com.android.systemui.user.domain.interactor.SelectedUserInteractor;
-import com.android.systemui.util.concurrency.DelayableExecutor;
-
-import org.junit.Before;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-public class UdfpsKeyguardViewLegacyControllerBaseTest extends SysuiTestCase {
- // Dependencies
- protected @Mock UdfpsKeyguardViewLegacy mView;
- protected @Mock Context mResourceContext;
- protected @Mock StatusBarStateController mStatusBarStateController;
- protected @Mock ShadeExpansionStateManager mShadeExpansionStateManager;
- protected @Mock StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
- protected @Mock LockscreenShadeTransitionController mLockscreenShadeTransitionController;
- protected @Mock DumpManager mDumpManager;
- protected @Mock DelayableExecutor mExecutor;
- protected @Mock KeyguardUpdateMonitor mKeyguardUpdateMonitor;
- protected @Mock KeyguardStateController mKeyguardStateController;
- protected @Mock KeyguardViewMediator mKeyguardViewMediator;
- protected @Mock ConfigurationController mConfigurationController;
- protected @Mock UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController;
- protected @Mock SystemUIDialogManager mDialogManager;
- protected @Mock UdfpsController mUdfpsController;
- protected @Mock ActivityTransitionAnimator mActivityTransitionAnimator;
- protected @Mock PrimaryBouncerInteractor mPrimaryBouncerInteractor;
- protected @Mock ShadeInteractor mShadeInteractor;
- protected @Mock AlternateBouncerInteractor mAlternateBouncerInteractor;
- protected @Mock UdfpsKeyguardAccessibilityDelegate mUdfpsKeyguardAccessibilityDelegate;
- protected @Mock SelectedUserInteractor mSelectedUserInteractor;
- protected @Mock KeyguardTransitionInteractor mKeyguardTransitionInteractor;
- protected @Mock UdfpsOverlayInteractor mUdfpsOverlayInteractor;
-
- protected FakeFeatureFlags mFeatureFlags = new FakeFeatureFlags();
-
- protected UdfpsKeyguardViewControllerLegacy mController;
-
- // Capture listeners so that they can be used to send events
- private @Captor ArgumentCaptor<StatusBarStateController.StateListener> mStateListenerCaptor;
- protected StatusBarStateController.StateListener mStatusBarStateListener;
-
- private @Captor ArgumentCaptor<KeyguardStateController.Callback>
- mKeyguardStateControllerCallbackCaptor;
- protected KeyguardStateController.Callback mKeyguardStateControllerCallback;
-
- private @Captor ArgumentCaptor<StatusBarKeyguardViewManager.KeyguardViewManagerCallback>
- mKeyguardViewManagerCallbackArgumentCaptor;
- protected StatusBarKeyguardViewManager.KeyguardViewManagerCallback mKeyguardViewManagerCallback;
-
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mSetFlagsRule.disableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR);
- when(mView.getContext()).thenReturn(mResourceContext);
- when(mResourceContext.getString(anyInt())).thenReturn("test string");
- when(mKeyguardViewMediator.isAnimatingScreenOff()).thenReturn(false);
- when(mView.getUnpausedAlpha()).thenReturn(255);
- when(mShadeExpansionStateManager.addExpansionListener(any())).thenReturn(
- new ShadeExpansionChangeEvent(0, false, false));
- mController = createUdfpsKeyguardViewController();
- }
-
- protected void sendStatusBarStateChanged(int statusBarState) {
- mStatusBarStateListener.onStateChanged(statusBarState);
- }
-
- protected void captureStatusBarStateListeners() {
- verify(mStatusBarStateController).addCallback(mStateListenerCaptor.capture());
- mStatusBarStateListener = mStateListenerCaptor.getValue();
- }
-
- protected void captureKeyguardStateControllerCallback() {
- verify(mKeyguardStateController).addCallback(
- mKeyguardStateControllerCallbackCaptor.capture());
- mKeyguardStateControllerCallback = mKeyguardStateControllerCallbackCaptor.getValue();
- }
-
- public UdfpsKeyguardViewControllerLegacy createUdfpsKeyguardViewController() {
- return createUdfpsKeyguardViewController(false);
- }
-
- public void captureKeyGuardViewManagerCallback() {
- verify(mStatusBarKeyguardViewManager).addCallback(
- mKeyguardViewManagerCallbackArgumentCaptor.capture());
- mKeyguardViewManagerCallback = mKeyguardViewManagerCallbackArgumentCaptor.getValue();
- }
-
- protected UdfpsKeyguardViewControllerLegacy createUdfpsKeyguardViewController(
- boolean useModernBouncer) {
- UdfpsKeyguardViewControllerLegacy controller = new UdfpsKeyguardViewControllerLegacy(
- mView,
- mStatusBarStateController,
- mStatusBarKeyguardViewManager,
- mKeyguardUpdateMonitor,
- mDumpManager,
- mLockscreenShadeTransitionController,
- mConfigurationController,
- mKeyguardStateController,
- mUnlockedScreenOffAnimationController,
- mDialogManager,
- mUdfpsController,
- mActivityTransitionAnimator,
- mPrimaryBouncerInteractor,
- mAlternateBouncerInteractor,
- mUdfpsKeyguardAccessibilityDelegate,
- mSelectedUserInteractor,
- mKeyguardTransitionInteractor,
- mShadeInteractor,
- mUdfpsOverlayInteractor);
- return controller;
- }
-}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerTest.java
deleted file mode 100644
index 98d8b054716c..000000000000
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerTest.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * Copyright (C) 2020 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 com.android.systemui.biometrics;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.atLeast;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.testing.TestableLooper;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import com.android.systemui.statusbar.StatusBarState;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@SmallTest
-@RunWith(AndroidJUnit4.class)
-
-@TestableLooper.RunWithLooper(setAsMainLooper = true)
-public class UdfpsKeyguardViewLegacyControllerTest extends
- UdfpsKeyguardViewLegacyControllerBaseTest {
- @Override
- public UdfpsKeyguardViewControllerLegacy createUdfpsKeyguardViewController() {
- return createUdfpsKeyguardViewController(/* useModernBouncer */ false);
- }
-
- @Test
- public void testShouldPauseAuth_bouncerShowing() {
- mController.onViewAttached();
- captureStatusBarStateListeners();
- sendStatusBarStateChanged(StatusBarState.KEYGUARD);
-
- when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(true);
- when(mStatusBarKeyguardViewManager.primaryBouncerIsOrWillBeShowing()).thenReturn(true);
- when(mView.getUnpausedAlpha()).thenReturn(0);
- assertTrue(mController.shouldPauseAuth());
- }
-
- @Test
- public void testRegistersStatusBarStateListenersOnAttached() {
- mController.onViewAttached();
- captureStatusBarStateListeners();
- }
-
- @Test
- public void testViewControllerQueriesSBStateOnAttached() {
- mController.onViewAttached();
- verify(mStatusBarStateController).getState();
-
- when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE_LOCKED);
- captureStatusBarStateListeners();
-
- mController.onViewAttached();
- verify(mView, atLeast(1)).setPauseAuth(true);
- }
-
- @Test
- public void testListenersUnregisteredOnDetached() {
- mController.onViewAttached();
- captureStatusBarStateListeners();
- captureKeyguardStateControllerCallback();
- mController.onViewDetached();
-
- verify(mStatusBarStateController).removeCallback(mStatusBarStateListener);
- verify(mKeyguardStateController).removeCallback(mKeyguardStateControllerCallback);
- }
-
- @Test
- public void testShouldPauseAuthUnpausedAlpha0() {
- mController.onViewAttached();
- captureStatusBarStateListeners();
-
- when(mView.getUnpausedAlpha()).thenReturn(0);
- sendStatusBarStateChanged(StatusBarState.KEYGUARD);
-
- assertTrue(mController.shouldPauseAuth());
- }
-
- @Test
- public void testShouldNotPauseAuthOnKeyguard() {
- mController.onViewAttached();
- captureStatusBarStateListeners();
-
- sendStatusBarStateChanged(StatusBarState.KEYGUARD);
-
- assertFalse(mController.shouldPauseAuth());
- }
-
- @Test
- public void onBiometricAuthenticated_pauseAuth() {
- // GIVEN view is attached and we're on the keyguard (see testShouldNotPauseAuthOnKeyguard)
- mController.onViewAttached();
- captureStatusBarStateListeners();
- sendStatusBarStateChanged(StatusBarState.KEYGUARD);
-
- // WHEN biometric is authenticated
- captureKeyguardStateControllerCallback();
- when(mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(anyInt())).thenReturn(true);
- mKeyguardStateControllerCallback.onUnlockedChanged();
-
- // THEN pause auth
- assertTrue(mController.shouldPauseAuth());
- }
-
- @Test
- public void testShouldPauseAuthIsLaunchTransitionFadingAway() {
- // GIVEN view is attached and we're on the keyguard (see testShouldNotPauseAuthOnKeyguard)
- mController.onViewAttached();
- captureStatusBarStateListeners();
- sendStatusBarStateChanged(StatusBarState.KEYGUARD);
-
- // WHEN isLaunchTransitionFadingAway=true
- captureKeyguardStateControllerCallback();
- when(mKeyguardStateController.isLaunchTransitionFadingAway()).thenReturn(true);
- mKeyguardStateControllerCallback.onLaunchTransitionFadingAwayChanged();
-
- // THEN pause auth
- assertTrue(mController.shouldPauseAuth());
- }
-
- @Test
- public void testShouldPauseAuthOnShadeLocked() {
- mController.onViewAttached();
- captureStatusBarStateListeners();
-
- sendStatusBarStateChanged(StatusBarState.SHADE_LOCKED);
-
- assertTrue(mController.shouldPauseAuth());
- }
-
- @Test
- public void testShouldPauseAuthOnShade() {
- mController.onViewAttached();
- captureStatusBarStateListeners();
-
- // WHEN not on keyguard yet (shade = home)
- sendStatusBarStateChanged(StatusBarState.SHADE);
-
- // THEN pause auth
- assertTrue(mController.shouldPauseAuth());
- }
-
- @Test
- public void testShouldPauseAuthAnimatingScreenOffFromShade() {
- mController.onViewAttached();
- captureStatusBarStateListeners();
-
- // WHEN transitioning from home/shade => keyguard + animating screen off
- mStatusBarStateListener.onStatePreChange(StatusBarState.SHADE, StatusBarState.KEYGUARD);
- when(mKeyguardViewMediator.isAnimatingScreenOff()).thenReturn(true);
-
- // THEN pause auth
- assertTrue(mController.shouldPauseAuth());
- }
-
- @Test
- public void testDoNotPauseAuthAnimatingScreenOffFromLS() {
- mController.onViewAttached();
- captureStatusBarStateListeners();
-
- // WHEN animating screen off transition from LS => AOD
- sendStatusBarStateChanged(StatusBarState.KEYGUARD);
- when(mKeyguardViewMediator.isAnimatingScreenOff()).thenReturn(true);
-
- // THEN don't pause auth
- assertFalse(mController.shouldPauseAuth());
- }
-
- @Test
- public void testOverrideShouldPauseAuthOnShadeLocked() {
- mController.onViewAttached();
- captureStatusBarStateListeners();
-
- sendStatusBarStateChanged(StatusBarState.SHADE_LOCKED);
- assertTrue(mController.shouldPauseAuth());
- }
-}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerWithCoroutinesTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerWithCoroutinesTest.kt
deleted file mode 100644
index 29a6e56891af..000000000000
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerWithCoroutinesTest.kt
+++ /dev/null
@@ -1,643 +0,0 @@
-/*
- * Copyright (C) 2022 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 com.android.systemui.biometrics
-
-import android.testing.TestableLooper
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.systemui.biometrics.UdfpsKeyguardViewLegacy.ANIMATE_APPEAR_ON_SCREEN_OFF
-import com.android.systemui.biometrics.UdfpsKeyguardViewLegacy.ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN
-import com.android.systemui.biometrics.domain.interactor.udfpsOverlayInteractor
-import com.android.systemui.bouncer.data.repository.fakeKeyguardBouncerRepository
-import com.android.systemui.bouncer.domain.interactor.alternateBouncerInteractor
-import com.android.systemui.bouncer.domain.interactor.primaryBouncerInteractor
-import com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants
-import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
-import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
-import com.android.systemui.keyguard.shared.model.KeyguardState
-import com.android.systemui.keyguard.shared.model.TransitionState
-import com.android.systemui.keyguard.shared.model.TransitionStep
-import com.android.systemui.kosmos.testScope
-import com.android.systemui.statusbar.StatusBarState
-import com.android.systemui.testKosmos
-import com.android.systemui.util.mockito.whenever
-import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.test.runCurrent
-import kotlinx.coroutines.test.runTest
-import org.junit.Assert.assertFalse
-import org.junit.Assert.assertTrue
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.ArgumentMatchers.any
-import org.mockito.ArgumentMatchers.anyInt
-import org.mockito.ArgumentMatchers.eq
-import org.mockito.Mockito
-import org.mockito.Mockito.never
-import org.mockito.Mockito.verify
-import org.mockito.MockitoAnnotations
-
-@RunWith(AndroidJUnit4::class)
-@SmallTest
-@TestableLooper.RunWithLooper
-@kotlinx.coroutines.ExperimentalCoroutinesApi
-class UdfpsKeyguardViewLegacyControllerWithCoroutinesTest :
- UdfpsKeyguardViewLegacyControllerBaseTest() {
- private val kosmos = testKosmos()
- private val testScope = kosmos.testScope
-
- private val keyguardBouncerRepository = kosmos.fakeKeyguardBouncerRepository
- private val transitionRepository = kosmos.fakeKeyguardTransitionRepository
-
- @Before
- override fun setUp() {
- allowTestableLooperAsMainThread() // repeatWhenAttached requires the main thread
- MockitoAnnotations.initMocks(this)
- super.setUp()
- }
-
- override fun createUdfpsKeyguardViewController(): UdfpsKeyguardViewControllerLegacy {
- mPrimaryBouncerInteractor = kosmos.primaryBouncerInteractor
- mAlternateBouncerInteractor = kosmos.alternateBouncerInteractor
- mKeyguardTransitionInteractor = kosmos.keyguardTransitionInteractor
- mUdfpsOverlayInteractor = kosmos.udfpsOverlayInteractor
- return createUdfpsKeyguardViewController(/* useModernBouncer */ true)
- }
-
- @Test
- fun bouncerExpansionChange_fadeIn() =
- testScope.runTest {
- // GIVEN view is attached
- mController.onViewAttached()
- captureKeyguardStateControllerCallback()
- Mockito.reset(mView)
-
- // WHEN status bar expansion is 0
- val job = mController.listenForBouncerExpansion(this)
- keyguardBouncerRepository.setPrimaryShow(true)
- keyguardBouncerRepository.setPanelExpansion(KeyguardBouncerConstants.EXPANSION_VISIBLE)
- runCurrent()
-
- // THEN alpha is 0
- verify(mView).unpausedAlpha = 0
-
- job.cancel()
- }
-
- @Test
- fun bouncerExpansionChange_pauseAuth() =
- testScope.runTest {
- // GIVEN view is attached + on the keyguard
- mController.onViewAttached()
- captureStatusBarStateListeners()
- sendStatusBarStateChanged(StatusBarState.KEYGUARD)
- Mockito.reset(mView)
-
- // WHEN panelViewExpansion changes to hide
- whenever(mView.unpausedAlpha).thenReturn(0)
- val job = mController.listenForBouncerExpansion(this)
- keyguardBouncerRepository.setPrimaryShow(true)
- keyguardBouncerRepository.setPanelExpansion(KeyguardBouncerConstants.EXPANSION_VISIBLE)
- runCurrent()
-
- // THEN pause auth is updated to PAUSE
- verify(mView, Mockito.atLeastOnce()).setPauseAuth(true)
-
- job.cancel()
- }
-
- @Test
- fun bouncerExpansionChange_unpauseAuth() =
- testScope.runTest {
- // GIVEN view is attached + on the keyguard + panel expansion is 0f
- mController.onViewAttached()
- captureStatusBarStateListeners()
- sendStatusBarStateChanged(StatusBarState.KEYGUARD)
- Mockito.reset(mView)
-
- // WHEN panelViewExpansion changes to expanded
- whenever(mView.unpausedAlpha).thenReturn(255)
- val job = mController.listenForBouncerExpansion(this)
- keyguardBouncerRepository.setPrimaryShow(true)
- keyguardBouncerRepository.setPanelExpansion(KeyguardBouncerConstants.EXPANSION_HIDDEN)
- runCurrent()
-
- // THEN pause auth is updated to NOT pause
- verify(mView, Mockito.atLeastOnce()).setPauseAuth(false)
-
- job.cancel()
- }
-
- @Test
- fun shadeLocked_showAlternateBouncer_unpauseAuth() =
- testScope.runTest {
- // GIVEN view is attached + on the SHADE_LOCKED (udfps view not showing)
- mController.onViewAttached()
- captureStatusBarStateListeners()
- sendStatusBarStateChanged(StatusBarState.SHADE_LOCKED)
-
- // WHEN alternate bouncer is requested
- val job = mController.listenForAlternateBouncerVisibility(this)
- keyguardBouncerRepository.setAlternateVisible(true)
- runCurrent()
-
- // THEN udfps view will animate in & pause auth is updated to NOT pause
- verify(mView).animateInUdfpsBouncer(any())
- assertFalse(mController.shouldPauseAuth())
-
- job.cancel()
- }
-
- /** After migration to MODERN_BOUNCER, replaces UdfpsKeyguardViewControllerTest version */
- @Test
- fun shouldPauseAuthBouncerShowing() =
- testScope.runTest {
- // GIVEN view attached and we're on the keyguard
- mController.onViewAttached()
- captureStatusBarStateListeners()
- sendStatusBarStateChanged(StatusBarState.KEYGUARD)
-
- // WHEN the bouncer expansion is VISIBLE
- val job = mController.listenForBouncerExpansion(this)
- keyguardBouncerRepository.setPrimaryShow(true)
- keyguardBouncerRepository.setPanelExpansion(KeyguardBouncerConstants.EXPANSION_VISIBLE)
- runCurrent()
-
- // THEN UDFPS shouldPauseAuth == true
- assertTrue(mController.shouldPauseAuth())
-
- job.cancel()
- }
-
- @Test
- fun shouldHandleTouchesChange() =
- testScope.runTest {
- val shouldHandleTouches by collectLastValue(mUdfpsOverlayInteractor.shouldHandleTouches)
-
- // GIVEN view is attached + on the keyguard
- mController.onViewAttached()
- captureStatusBarStateListeners()
- sendStatusBarStateChanged(StatusBarState.KEYGUARD)
- whenever(mView.setPauseAuth(true)).thenReturn(true)
- whenever(mView.unpausedAlpha).thenReturn(0)
-
- // WHEN panelViewExpansion changes to expanded
- val job = mController.listenForBouncerExpansion(this)
- keyguardBouncerRepository.setPrimaryShow(true)
- keyguardBouncerRepository.setPanelExpansion(KeyguardBouncerConstants.EXPANSION_VISIBLE)
- runCurrent()
-
- // THEN UDFPS auth is paused and should not handle touches
- assertThat(mController.shouldPauseAuth()).isTrue()
- assertThat(shouldHandleTouches!!).isFalse()
-
- job.cancel()
- }
-
- @Test
- fun shouldHandleTouchesOnDetach() =
- testScope.runTest {
- val shouldHandleTouches by collectLastValue(mUdfpsOverlayInteractor.shouldHandleTouches)
-
- // GIVEN view is attached + on the keyguard
- mController.onViewAttached()
- captureStatusBarStateListeners()
- sendStatusBarStateChanged(StatusBarState.KEYGUARD)
- whenever(mView.setPauseAuth(true)).thenReturn(true)
- whenever(mView.unpausedAlpha).thenReturn(0)
-
- // WHEN panelViewExpansion changes to expanded
- val job = mController.listenForBouncerExpansion(this)
- keyguardBouncerRepository.setPrimaryShow(true)
- keyguardBouncerRepository.setPanelExpansion(KeyguardBouncerConstants.EXPANSION_VISIBLE)
- runCurrent()
-
- mController.onViewDetached()
-
- // THEN UDFPS auth is paused and should not handle touches
- assertThat(mController.shouldPauseAuth()).isTrue()
- assertThat(shouldHandleTouches!!).isFalse()
-
- job.cancel()
- }
-
- @Test
- fun fadeFromDialogSuggestedAlpha() =
- testScope.runTest {
- // GIVEN view is attached and status bar expansion is 1f
- mController.onViewAttached()
- captureStatusBarStateListeners()
- val job = mController.listenForBouncerExpansion(this)
- keyguardBouncerRepository.setPrimaryShow(true)
- keyguardBouncerRepository.setPanelExpansion(KeyguardBouncerConstants.EXPANSION_HIDDEN)
- runCurrent()
- Mockito.reset(mView)
-
- // WHEN dialog suggested alpha is .6f
- whenever(mView.dialogSuggestedAlpha).thenReturn(.6f)
- sendStatusBarStateChanged(StatusBarState.KEYGUARD)
-
- // THEN alpha is updated based on dialog suggested alpha
- verify(mView).unpausedAlpha = (.6f * 255).toInt()
-
- job.cancel()
- }
-
- @Test
- fun transitionToFullShadeProgress() =
- testScope.runTest {
- // GIVEN view is attached and status bar expansion is 1f
- mController.onViewAttached()
- val job = mController.listenForBouncerExpansion(this)
- keyguardBouncerRepository.setPrimaryShow(true)
- keyguardBouncerRepository.setPanelExpansion(KeyguardBouncerConstants.EXPANSION_HIDDEN)
- runCurrent()
- Mockito.reset(mView)
- whenever(mView.dialogSuggestedAlpha).thenReturn(1f)
-
- // WHEN we're transitioning to the full shade
- val transitionProgress = .6f
- mController.setTransitionToFullShadeProgress(transitionProgress)
-
- // THEN alpha is between 0 and 255
- verify(mView).unpausedAlpha = ((1f - transitionProgress) * 255).toInt()
-
- job.cancel()
- }
-
- @Test
- fun aodToLockscreen_dozeAmountChanged() =
- testScope.runTest {
- // GIVEN view is attached
- mController.onViewAttached()
- Mockito.reset(mView)
-
- val job = mController.listenForLockscreenAodTransitions(this)
-
- // WHEN transitioning from lockscreen to aod
- transitionRepository.sendTransitionStep(
- TransitionStep(
- from = KeyguardState.LOCKSCREEN,
- to = KeyguardState.AOD,
- value = .3f,
- transitionState = TransitionState.RUNNING
- )
- )
- runCurrent()
- // THEN doze amount is updated
- verify(mView)
- .onDozeAmountChanged(
- eq(.3f),
- eq(.3f),
- eq(UdfpsKeyguardViewLegacy.ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN)
- )
-
- transitionRepository.sendTransitionStep(
- TransitionStep(
- from = KeyguardState.LOCKSCREEN,
- to = KeyguardState.AOD,
- value = 1f,
- transitionState = TransitionState.FINISHED
- )
- )
- runCurrent()
- // THEN doze amount is updated
- verify(mView)
- .onDozeAmountChanged(
- eq(1f),
- eq(1f),
- eq(UdfpsKeyguardViewLegacy.ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN)
- )
-
- job.cancel()
- }
-
- @Test
- fun lockscreenToAod_dozeAmountChanged() =
- testScope.runTest {
- // GIVEN view is attached
- mController.onViewAttached()
- Mockito.reset(mView)
-
- val job = mController.listenForLockscreenAodTransitions(this)
-
- // WHEN transitioning from lockscreen to aod
- transitionRepository.sendTransitionStep(
- TransitionStep(
- from = KeyguardState.LOCKSCREEN,
- to = KeyguardState.AOD,
- value = .3f,
- transitionState = TransitionState.RUNNING
- )
- )
- runCurrent()
- // THEN doze amount is updated
- verify(mView)
- .onDozeAmountChanged(
- eq(.3f),
- eq(.3f),
- eq(UdfpsKeyguardViewLegacy.ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN)
- )
-
- transitionRepository.sendTransitionStep(
- TransitionStep(
- from = KeyguardState.LOCKSCREEN,
- to = KeyguardState.AOD,
- value = 1f,
- transitionState = TransitionState.FINISHED
- )
- )
- runCurrent()
- // THEN doze amount is updated
- verify(mView)
- .onDozeAmountChanged(
- eq(1f),
- eq(1f),
- eq(UdfpsKeyguardViewLegacy.ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN)
- )
-
- job.cancel()
- }
-
- @Test
- fun goneToAod_dozeAmountChanged() =
- testScope.runTest {
- // GIVEN view is attached
- mController.onViewAttached()
- Mockito.reset(mView)
-
- val job = mController.listenForGoneToAodTransition(this)
-
- // WHEN transitioning from lockscreen to aod
- transitionRepository.sendTransitionStep(
- TransitionStep(
- from = KeyguardState.GONE,
- to = KeyguardState.AOD,
- value = .3f,
- transitionState = TransitionState.RUNNING
- )
- )
- runCurrent()
- // THEN doze amount is updated
- verify(mView)
- .onDozeAmountChanged(
- eq(.3f),
- eq(.3f),
- eq(UdfpsKeyguardViewLegacy.ANIMATE_APPEAR_ON_SCREEN_OFF)
- )
-
- transitionRepository.sendTransitionStep(
- TransitionStep(
- from = KeyguardState.GONE,
- to = KeyguardState.AOD,
- value = 1f,
- transitionState = TransitionState.FINISHED
- )
- )
- runCurrent()
- // THEN doze amount is updated
- verify(mView)
- .onDozeAmountChanged(
- eq(1f),
- eq(1f),
- eq(UdfpsKeyguardViewLegacy.ANIMATE_APPEAR_ON_SCREEN_OFF)
- )
-
- job.cancel()
- }
-
- @Test
- fun aodToOccluded_dozeAmountChanged() =
- testScope.runTest {
- // GIVEN view is attached
- mController.onViewAttached()
- Mockito.reset(mView)
-
- val job = mController.listenForAodToOccludedTransitions(this)
-
- // WHEN transitioning from aod to occluded
- transitionRepository.sendTransitionStep(
- TransitionStep(
- from = KeyguardState.AOD,
- to = KeyguardState.OCCLUDED,
- value = .3f,
- transitionState = TransitionState.RUNNING
- )
- )
- runCurrent()
- // THEN doze amount is updated
- verify(mView)
- .onDozeAmountChanged(eq(.7f), eq(.7f), eq(UdfpsKeyguardViewLegacy.ANIMATION_NONE))
-
- transitionRepository.sendTransitionStep(
- TransitionStep(
- from = KeyguardState.AOD,
- to = KeyguardState.OCCLUDED,
- value = 1f,
- transitionState = TransitionState.FINISHED
- )
- )
- runCurrent()
- // THEN doze amount is updated
- verify(mView)
- .onDozeAmountChanged(eq(0f), eq(0f), eq(UdfpsKeyguardViewLegacy.ANIMATION_NONE))
-
- job.cancel()
- }
-
- @Test
- fun occludedToAod_dozeAmountChanged() =
- testScope.runTest {
- // GIVEN view is attached
- mController.onViewAttached()
- Mockito.reset(mView)
-
- val job = mController.listenForOccludedToAodTransition(this)
-
- // WHEN transitioning from occluded to aod
- transitionRepository.sendTransitionStep(
- TransitionStep(
- from = KeyguardState.OCCLUDED,
- to = KeyguardState.AOD,
- value = .3f,
- transitionState = TransitionState.RUNNING
- )
- )
- runCurrent()
- // THEN doze amount is updated
- verify(mView)
- .onDozeAmountChanged(
- eq(.3f),
- eq(.3f),
- eq(UdfpsKeyguardViewLegacy.ANIMATE_APPEAR_ON_SCREEN_OFF)
- )
-
- transitionRepository.sendTransitionStep(
- TransitionStep(
- from = KeyguardState.OCCLUDED,
- to = KeyguardState.AOD,
- value = 1f,
- transitionState = TransitionState.FINISHED
- )
- )
- runCurrent()
- // THEN doze amount is updated
- verify(mView)
- .onDozeAmountChanged(
- eq(1f),
- eq(1f),
- eq(UdfpsKeyguardViewLegacy.ANIMATE_APPEAR_ON_SCREEN_OFF)
- )
-
- job.cancel()
- }
-
- @Test
- fun cancelledAodToLockscreen_dozeAmountChangedToZero() =
- testScope.runTest {
- // GIVEN view is attached
- mController.onViewAttached()
- val job = mController.listenForLockscreenAodTransitions(this)
- runCurrent()
- Mockito.reset(mView)
-
- // WHEN aod to lockscreen transition is cancelled
- transitionRepository.sendTransitionStep(
- TransitionStep(
- from = KeyguardState.AOD,
- to = KeyguardState.LOCKSCREEN,
- value = 1f,
- transitionState = TransitionState.CANCELED
- )
- )
- runCurrent()
- // ... and WHEN the next transition is from lockscreen => occluded
- transitionRepository.sendTransitionStep(
- TransitionStep(
- from = KeyguardState.LOCKSCREEN,
- to = KeyguardState.OCCLUDED,
- value = .4f,
- transitionState = TransitionState.STARTED
- )
- )
- runCurrent()
-
- // THEN doze amount is updated to zero
- verify(mView)
- .onDozeAmountChanged(eq(0f), eq(0f), eq(ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN))
- job.cancel()
- }
-
- @Test
- fun cancelledLockscreenToAod_dozeAmountNotUpdatedToZero() =
- testScope.runTest {
- // GIVEN view is attached
- mController.onViewAttached()
- val job = mController.listenForLockscreenAodTransitions(this)
- runCurrent()
- Mockito.reset(mView)
-
- // WHEN lockscreen to aod transition is cancelled
- transitionRepository.sendTransitionStep(
- TransitionStep(
- from = KeyguardState.LOCKSCREEN,
- to = KeyguardState.AOD,
- value = 1f,
- transitionState = TransitionState.CANCELED
- )
- )
- runCurrent()
-
- // THEN doze amount is NOT updated to zero
- verify(mView, never()).onDozeAmountChanged(eq(0f), eq(0f), anyInt())
- job.cancel()
- }
-
- @Test
- fun dreamingToAod_dozeAmountChanged() =
- testScope.runTest {
- // GIVEN view is attached
- mController.onViewAttached()
- Mockito.reset(mView)
-
- val job = mController.listenForDreamingToAodTransitions(this)
- // WHEN dreaming to aod transition in progress
- transitionRepository.sendTransitionStep(
- TransitionStep(
- from = KeyguardState.DREAMING,
- to = KeyguardState.AOD,
- value = .3f,
- transitionState = TransitionState.RUNNING
- )
- )
- runCurrent()
-
- // THEN doze amount is updated to
- verify(mView).onDozeAmountChanged(eq(.3f), eq(.3f), eq(ANIMATE_APPEAR_ON_SCREEN_OFF))
- job.cancel()
- }
-
- @Test
- fun alternateBouncerToAod_dozeAmountChanged() =
- testScope.runTest {
- // GIVEN view is attached
- mController.onViewAttached()
- Mockito.reset(mView)
-
- val job = mController.listenForAlternateBouncerToAodTransitions(this)
- // WHEN alternate bouncer to aod transition in progress
- transitionRepository.sendTransitionStep(
- TransitionStep(
- from = KeyguardState.ALTERNATE_BOUNCER,
- to = KeyguardState.AOD,
- value = .3f,
- transitionState = TransitionState.RUNNING
- )
- )
- runCurrent()
-
- // THEN doze amount is updated to
- verify(mView)
- .onDozeAmountChanged(eq(.3f), eq(.3f), eq(ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN))
- job.cancel()
- }
-
- @Test
- fun bouncerToAod_dozeAmountChanged() =
- testScope.runTest {
- // GIVEN view is attached
- mController.onViewAttached()
- Mockito.reset(mView)
-
- val job = mController.listenForPrimaryBouncerToAodTransitions(this)
- // WHEN alternate bouncer to aod transition in progress
- transitionRepository.sendTransitionStep(
- TransitionStep(
- from = KeyguardState.PRIMARY_BOUNCER,
- to = KeyguardState.AOD,
- value = .3f,
- transitionState = TransitionState.RUNNING
- )
- )
- runCurrent()
-
- // THEN doze amount is updated to
- verify(mView).onDozeAmountChanged(eq(.3f), eq(.3f), eq(ANIMATE_APPEAR_ON_SCREEN_OFF))
- job.cancel()
- }
-}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractorTest.kt
index 68cfa28dabd7..82ff61795e98 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractorTest.kt
@@ -16,12 +16,9 @@
package com.android.systemui.bouncer.domain.interactor
-import android.platform.test.annotations.DisableFlags
-import android.platform.test.annotations.EnableFlags
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.keyguard.keyguardUpdateMonitor
-import com.android.systemui.Flags
import com.android.systemui.SysuiTestCase
import com.android.systemui.authentication.data.repository.FakeAuthenticationRepository
import com.android.systemui.authentication.domain.interactor.authenticationInteractor
@@ -61,12 +58,6 @@ class AlternateBouncerInteractorTest : SysuiTestCase() {
underTest = kosmos.alternateBouncerInteractor
}
- @Test(expected = IllegalStateException::class)
- @EnableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
- fun enableUdfpsRefactor_deprecatedShowMethod_throwsIllegalStateException() {
- underTest.show()
- }
-
@Test
@DisableSceneContainer
fun canShowAlternateBouncer_false_dueToTransitionState() =
@@ -101,21 +92,6 @@ class AlternateBouncerInteractorTest : SysuiTestCase() {
}
@Test
- @DisableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
- fun canShowAlternateBouncerForFingerprint_givenCanShow() {
- givenCanShowAlternateBouncer()
- assertTrue(underTest.canShowAlternateBouncerForFingerprint())
- }
-
- @Test
- fun canShowAlternateBouncerForFingerprint_alternateBouncerUIUnavailable() {
- givenCanShowAlternateBouncer()
- kosmos.keyguardBouncerRepository.setAlternateBouncerUIAvailable(false)
-
- assertFalse(underTest.canShowAlternateBouncerForFingerprint())
- }
-
- @Test
fun canShowAlternateBouncerForFingerprint_ifFingerprintIsNotUsuallyAllowed() {
givenCanShowAlternateBouncer()
kosmos.biometricSettingsRepository.setIsFingerprintAuthEnrolledAndEnabled(false)
@@ -140,15 +116,6 @@ class AlternateBouncerInteractorTest : SysuiTestCase() {
}
@Test
- @DisableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
- fun show_whenCanShow() {
- givenCanShowAlternateBouncer()
-
- assertTrue(underTest.show())
- assertTrue(kosmos.keyguardBouncerRepository.alternateBouncerVisible.value)
- }
-
- @Test
fun canShowAlternateBouncerForFingerprint_butCanDismissLockScreen() {
givenCanShowAlternateBouncer()
whenever(kosmos.keyguardStateController.isUnlocked).thenReturn(true)
@@ -165,15 +132,6 @@ class AlternateBouncerInteractorTest : SysuiTestCase() {
}
@Test
- @DisableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
- fun show_whenCannotShow() {
- givenCannotShowAlternateBouncer()
-
- assertFalse(underTest.show())
- assertFalse(kosmos.keyguardBouncerRepository.alternateBouncerVisible.value)
- }
-
- @Test
fun hide_wasPreviouslyShowing() {
kosmos.keyguardBouncerRepository.setAlternateVisible(true)
@@ -190,7 +148,6 @@ class AlternateBouncerInteractorTest : SysuiTestCase() {
}
@Test
- @EnableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
fun canShowAlternateBouncerForFingerprint_rearFps() {
givenCanShowAlternateBouncer()
kosmos.fingerprintPropertyRepository.supportsRearFps() // does not support alternate bouncer
@@ -198,29 +155,6 @@ class AlternateBouncerInteractorTest : SysuiTestCase() {
assertFalse(underTest.canShowAlternateBouncerForFingerprint())
}
- @Test
- @DisableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
- fun alternateBouncerUiAvailable_fromMultipleSources() {
- assertFalse(kosmos.keyguardBouncerRepository.alternateBouncerUIAvailable.value)
-
- // GIVEN there are two different sources indicating the alternate bouncer is available
- underTest.setAlternateBouncerUIAvailable(true, "source1")
- underTest.setAlternateBouncerUIAvailable(true, "source2")
- assertTrue(kosmos.keyguardBouncerRepository.alternateBouncerUIAvailable.value)
-
- // WHEN one of the sources no longer says the UI is available
- underTest.setAlternateBouncerUIAvailable(false, "source1")
-
- // THEN alternate bouncer UI is still available (from the other source)
- assertTrue(kosmos.keyguardBouncerRepository.alternateBouncerUIAvailable.value)
-
- // WHEN all sources say the UI is not available
- underTest.setAlternateBouncerUIAvailable(false, "source2")
-
- // THEN alternate boucer UI is not available
- assertFalse(kosmos.keyguardBouncerRepository.alternateBouncerUIAvailable.value)
- }
-
private fun givenAlternateBouncerSupported() {
kosmos.givenAlternateBouncerSupported()
}
@@ -228,8 +162,4 @@ class AlternateBouncerInteractorTest : SysuiTestCase() {
private fun givenCanShowAlternateBouncer() {
kosmos.givenCanShowAlternateBouncer()
}
-
- private fun givenCannotShowAlternateBouncer() {
- kosmos.givenCannotShowAlternateBouncer()
- }
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinderTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinderTest.kt
index c4eabd84e031..380060865282 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinderTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinderTest.kt
@@ -16,7 +16,6 @@
package com.android.systemui.keyguard.ui.binder
-import android.platform.test.annotations.EnableFlags
import android.testing.TestableLooper
import android.view.View
import android.view.layoutInflater
@@ -24,7 +23,6 @@ import android.view.mockedLayoutInflater
import android.view.windowManager
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
-import com.android.systemui.Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR
import com.android.systemui.SysuiTestCase
import com.android.systemui.bouncer.domain.interactor.givenCanShowAlternateBouncer
import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
@@ -63,7 +61,7 @@ class AlternateBouncerViewBinderTest : SysuiTestCase() {
kosmos.mockedLayoutInflater.inflate(
eq(R.layout.alternate_bouncer),
isNull(),
- anyBoolean()
+ anyBoolean(),
)
)
.thenReturn(mockedAltBouncerView)
@@ -71,7 +69,6 @@ class AlternateBouncerViewBinderTest : SysuiTestCase() {
}
@Test
- @EnableFlags(FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
fun addViewToWindowManager() {
testScope.runTest {
kosmos.givenCanShowAlternateBouncer()
@@ -85,7 +82,6 @@ class AlternateBouncerViewBinderTest : SysuiTestCase() {
}
@Test
- @EnableFlags(FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
fun viewRemovedImmediatelyIfAlreadyAttachedToWindow() {
testScope.runTest {
kosmos.givenCanShowAlternateBouncer()
@@ -107,7 +103,6 @@ class AlternateBouncerViewBinderTest : SysuiTestCase() {
}
@Test
- @EnableFlags(FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
fun viewNotRemovedUntilAttachedToWindow() {
testScope.runTest {
kosmos.givenCanShowAlternateBouncer()
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt
index 6f2302a22d7b..9fe52991c3a0 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt
@@ -30,7 +30,6 @@ import android.view.ViewGroup
import android.view.ViewTreeObserver
import androidx.test.filters.SmallTest
import com.android.keyguard.KeyguardSecurityContainerController
-import com.android.keyguard.LegacyLockIconViewController
import com.android.keyguard.dagger.KeyguardBouncerComponent
import com.android.systemui.Flags
import com.android.systemui.Flags.FLAG_MIGRATE_CLOCKS_TO_BLUEPRINT
@@ -54,7 +53,6 @@ import com.android.systemui.keyguard.shared.model.KeyguardState.DREAMING
import com.android.systemui.keyguard.shared.model.KeyguardState.LOCKSCREEN
import com.android.systemui.keyguard.shared.model.TransitionStep
import com.android.systemui.res.R
-import com.android.systemui.scene.shared.flag.SceneContainerFlag
import com.android.systemui.shade.NotificationShadeWindowView.InteractionEventHandler
import com.android.systemui.shade.domain.interactor.PanelExpansionInteractor
import com.android.systemui.statusbar.DragDownHelper
@@ -71,7 +69,6 @@ import com.android.systemui.statusbar.phone.CentralSurfaces
import com.android.systemui.statusbar.phone.DozeScrimController
import com.android.systemui.statusbar.phone.DozeServiceHost
import com.android.systemui.statusbar.phone.PhoneStatusBarViewController
-import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager
import com.android.systemui.statusbar.window.StatusBarWindowStateController
import com.android.systemui.unfold.SysUIUnfoldComponent
import com.android.systemui.unfold.UnfoldTransitionProgressProvider
@@ -80,6 +77,7 @@ import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.eq
import com.android.systemui.util.time.FakeSystemClock
import com.google.common.truth.Truth.assertThat
+import java.util.Optional
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.emptyFlow
@@ -98,11 +96,10 @@ import org.mockito.Mockito.mock
import org.mockito.Mockito.never
import org.mockito.Mockito.times
import org.mockito.Mockito.verify
+import org.mockito.Mockito.`when` as whenever
import org.mockito.MockitoAnnotations
import platform.test.runner.parameterized.ParameterizedAndroidJunit4
import platform.test.runner.parameterized.Parameters
-import java.util.Optional
-import org.mockito.Mockito.`when` as whenever
@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
@@ -125,12 +122,10 @@ class NotificationShadeWindowViewControllerTest(flags: FlagsParameterization) :
@Mock private lateinit var dumpManager: DumpManager
@Mock private lateinit var ambientState: AmbientState
@Mock private lateinit var stackScrollLayoutController: NotificationStackScrollLayoutController
- @Mock private lateinit var statusBarKeyguardViewManager: StatusBarKeyguardViewManager
@Mock private lateinit var statusBarWindowStateController: StatusBarWindowStateController
@Mock private lateinit var quickSettingsController: QuickSettingsControllerImpl
@Mock
private lateinit var lockscreenShadeTransitionController: LockscreenShadeTransitionController
- @Mock private lateinit var lockIconViewController: LegacyLockIconViewController
@Mock private lateinit var phoneStatusBarViewController: PhoneStatusBarViewController
@Mock private lateinit var pulsingGestureListener: PulsingGestureListener
@Mock
@@ -144,7 +139,7 @@ class NotificationShadeWindowViewControllerTest(flags: FlagsParameterization) :
@Mock lateinit var keyguardSecurityContainerController: KeyguardSecurityContainerController
@Mock
private lateinit var unfoldTransitionProgressProvider:
- Optional<UnfoldTransitionProgressProvider>
+ Optional<UnfoldTransitionProgressProvider>
@Mock lateinit var keyguardTransitionInteractor: KeyguardTransitionInteractor
@Mock lateinit var dragDownHelper: DragDownHelper
@Mock lateinit var mSelectedUserInteractor: SelectedUserInteractor
@@ -176,20 +171,17 @@ class NotificationShadeWindowViewControllerTest(flags: FlagsParameterization) :
MockitoAnnotations.initMocks(this)
whenever(view.bottom).thenReturn(VIEW_BOTTOM)
whenever(view.findViewById<ViewGroup>(R.id.keyguard_bouncer_container))
- .thenReturn(mock(ViewGroup::class.java))
+ .thenReturn(mock(ViewGroup::class.java))
whenever(keyguardBouncerComponentFactory.create(any(ViewGroup::class.java)))
- .thenReturn(keyguardBouncerComponent)
+ .thenReturn(keyguardBouncerComponent)
whenever(keyguardBouncerComponent.securityContainerController)
- .thenReturn(keyguardSecurityContainerController)
+ .thenReturn(keyguardSecurityContainerController)
whenever(keyguardTransitionInteractor.transition(Edge.create(LOCKSCREEN, DREAMING)))
- .thenReturn(emptyFlow<TransitionStep>())
+ .thenReturn(emptyFlow<TransitionStep>())
featureFlagsClassic = FakeFeatureFlagsClassic()
featureFlagsClassic.set(SPLIT_SHADE_SUBPIXEL_OPTIMIZATION, true)
featureFlagsClassic.set(LOCKSCREEN_WALLPAPER_DREAM_ENABLED, false)
- if (!SceneContainerFlag.isEnabled) {
- mSetFlagsRule.disableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
- }
mSetFlagsRule.enableFlags(Flags.FLAG_REVAMPED_BOUNCER_MESSAGES)
testScope = TestScope()
@@ -208,9 +200,7 @@ class NotificationShadeWindowViewControllerTest(flags: FlagsParameterization) :
panelExpansionInteractor,
ShadeExpansionStateManager(),
stackScrollLayoutController,
- statusBarKeyguardViewManager,
statusBarWindowStateController,
- lockIconViewController,
centralSurfaces,
dozeServiceHost,
dozeScrimController,
@@ -233,7 +223,7 @@ class NotificationShadeWindowViewControllerTest(flags: FlagsParameterization) :
quickSettingsController,
primaryBouncerInteractor,
alternateBouncerInteractor,
- mock(BouncerViewBinder::class.java)
+ mock(BouncerViewBinder::class.java),
)
underTest.setupExpandedStatusBar()
underTest.setDragDownHelper(dragDownHelper)
@@ -294,7 +284,7 @@ class NotificationShadeWindowViewControllerTest(flags: FlagsParameterization) :
whenever(statusBarWindowStateController.windowIsShowing()).thenReturn(true)
whenever(panelExpansionInteractor.isFullyCollapsed).thenReturn(true)
whenever(phoneStatusBarViewController.touchIsWithinView(anyFloat(), anyFloat()))
- .thenReturn(true)
+ .thenReturn(true)
whenever(phoneStatusBarViewController.sendTouchToView(DOWN_EVENT)).thenReturn(true)
val returnVal = interactionEventHandler.handleDispatchTouchEvent(DOWN_EVENT)
@@ -309,7 +299,7 @@ class NotificationShadeWindowViewControllerTest(flags: FlagsParameterization) :
underTest.setStatusBarViewController(phoneStatusBarViewController)
whenever(statusBarWindowStateController.windowIsShowing()).thenReturn(true)
whenever(phoneStatusBarViewController.touchIsWithinView(anyFloat(), anyFloat()))
- .thenReturn(true)
+ .thenReturn(true)
// Item we're testing
whenever(panelExpansionInteractor.isFullyCollapsed).thenReturn(false)
@@ -327,7 +317,7 @@ class NotificationShadeWindowViewControllerTest(flags: FlagsParameterization) :
whenever(panelExpansionInteractor.isFullyCollapsed).thenReturn(true)
// Item we're testing
whenever(phoneStatusBarViewController.touchIsWithinView(anyFloat(), anyFloat()))
- .thenReturn(false)
+ .thenReturn(false)
val returnVal = interactionEventHandler.handleDispatchTouchEvent(DOWN_EVENT)
@@ -341,7 +331,7 @@ class NotificationShadeWindowViewControllerTest(flags: FlagsParameterization) :
underTest.setStatusBarViewController(phoneStatusBarViewController)
whenever(panelExpansionInteractor.isFullyCollapsed).thenReturn(true)
whenever(phoneStatusBarViewController.touchIsWithinView(anyFloat(), anyFloat()))
- .thenReturn(true)
+ .thenReturn(true)
// Item we're testing
whenever(statusBarWindowStateController.windowIsShowing()).thenReturn(false)
@@ -358,7 +348,7 @@ class NotificationShadeWindowViewControllerTest(flags: FlagsParameterization) :
whenever(statusBarWindowStateController.windowIsShowing()).thenReturn(true)
whenever(panelExpansionInteractor.isFullyCollapsed).thenReturn(true)
whenever(phoneStatusBarViewController.touchIsWithinView(anyFloat(), anyFloat()))
- .thenReturn(true)
+ .thenReturn(true)
// Down event first
interactionEventHandler.handleDispatchTouchEvent(DOWN_EVENT)
@@ -379,7 +369,7 @@ class NotificationShadeWindowViewControllerTest(flags: FlagsParameterization) :
// GIVEN touch dispatcher in a state that returns true
underTest.setStatusBarViewController(phoneStatusBarViewController)
whenever(keyguardUnlockAnimationController.isPlayingCannedUnlockAnimation())
- .thenReturn(true)
+ .thenReturn(true)
assertThat(interactionEventHandler.handleDispatchTouchEvent(DOWN_EVENT)).isTrue()
// WHEN launch animation is running for 2 seconds
@@ -432,47 +422,13 @@ class NotificationShadeWindowViewControllerTest(flags: FlagsParameterization) :
}
@Test
- fun shouldInterceptTouchEvent_statusBarKeyguardViewManagerShouldIntercept() {
- // down event should be intercepted by keyguardViewManager
- whenever(statusBarKeyguardViewManager.shouldInterceptTouchEvent(DOWN_EVENT))
- .thenReturn(true)
-
- // Then touch should not be intercepted
- val shouldIntercept = interactionEventHandler.shouldInterceptTouchEvent(DOWN_EVENT)
- assertThat(shouldIntercept).isTrue()
- }
-
- @Test
- @EnableFlags(FLAG_MIGRATE_CLOCKS_TO_BLUEPRINT)
- fun shouldInterceptTouchEvent_dozing_touchInLockIconArea_touchNotIntercepted() {
- // GIVEN dozing
- whenever(sysuiStatusBarStateController.isDozing).thenReturn(true)
- // AND alternate bouncer doesn't want the touch
- whenever(statusBarKeyguardViewManager.shouldInterceptTouchEvent(DOWN_EVENT))
- .thenReturn(false)
- // AND quick settings controller doesn't want it
- whenever(quickSettingsController.shouldQuickSettingsIntercept(any(), any(), any()))
- .thenReturn(false)
- // AND the lock icon wants the touch
- whenever(lockIconViewController.willHandleTouchWhileDozing(DOWN_EVENT)).thenReturn(true)
-
- // THEN touch should NOT be intercepted by NotificationShade
- assertThat(interactionEventHandler.shouldInterceptTouchEvent(DOWN_EVENT)).isFalse()
- }
-
- @Test
@EnableFlags(FLAG_MIGRATE_CLOCKS_TO_BLUEPRINT)
fun shouldInterceptTouchEvent_dozing_touchNotInLockIconArea_touchIntercepted() {
// GIVEN dozing
whenever(sysuiStatusBarStateController.isDozing).thenReturn(true)
- // AND alternate bouncer doesn't want the touch
- whenever(statusBarKeyguardViewManager.shouldInterceptTouchEvent(DOWN_EVENT))
- .thenReturn(false)
- // AND the lock icon does NOT want the touch
- whenever(lockIconViewController.willHandleTouchWhileDozing(DOWN_EVENT)).thenReturn(false)
// AND quick settings controller doesn't want it
whenever(quickSettingsController.shouldQuickSettingsIntercept(any(), any(), any()))
- .thenReturn(false)
+ .thenReturn(false)
// THEN touch should be intercepted by NotificationShade
assertThat(interactionEventHandler.shouldInterceptTouchEvent(DOWN_EVENT)).isTrue()
@@ -483,14 +439,9 @@ class NotificationShadeWindowViewControllerTest(flags: FlagsParameterization) :
fun shouldInterceptTouchEvent_dozing_touchInStatusBar_touchIntercepted() {
// GIVEN dozing
whenever(sysuiStatusBarStateController.isDozing).thenReturn(true)
- // AND alternate bouncer doesn't want the touch
- whenever(statusBarKeyguardViewManager.shouldInterceptTouchEvent(DOWN_EVENT))
- .thenReturn(false)
- // AND the lock icon does NOT want the touch
- whenever(lockIconViewController.willHandleTouchWhileDozing(DOWN_EVENT)).thenReturn(false)
// AND quick settings controller DOES want it
whenever(quickSettingsController.shouldQuickSettingsIntercept(any(), any(), any()))
- .thenReturn(true)
+ .thenReturn(true)
// THEN touch should be intercepted by NotificationShade
assertThat(interactionEventHandler.shouldInterceptTouchEvent(DOWN_EVENT)).isTrue()
@@ -503,20 +454,13 @@ class NotificationShadeWindowViewControllerTest(flags: FlagsParameterization) :
whenever(sysuiStatusBarStateController.isDozing).thenReturn(true)
// AND pulsing
whenever(dozeServiceHost.isPulsing()).thenReturn(true)
- // AND status bar doesn't want it
- whenever(statusBarKeyguardViewManager.shouldInterceptTouchEvent(DOWN_EVENT))
- .thenReturn(false)
- // AND shade is not fully expanded (mock is false by default)
- // AND the lock icon does NOT want the touch
- whenever(lockIconViewController.willHandleTouchWhileDozing(DOWN_EVENT)).thenReturn(false)
// AND quick settings controller DOES want it
whenever(quickSettingsController.shouldQuickSettingsIntercept(any(), any(), any()))
- .thenReturn(true)
+ .thenReturn(true)
// AND bouncer is not showing
whenever(centralSurfaces.isBouncerShowing()).thenReturn(false)
// AND panel view controller wants it
- whenever(shadeViewController.handleExternalInterceptTouch(DOWN_EVENT))
- .thenReturn(true)
+ whenever(shadeViewController.handleExternalInterceptTouch(DOWN_EVENT)).thenReturn(true)
// THEN touch should be intercepted by NotificationShade
assertThat(interactionEventHandler.shouldInterceptTouchEvent(DOWN_EVENT)).isTrue()
@@ -589,12 +533,10 @@ class NotificationShadeWindowViewControllerTest(flags: FlagsParameterization) :
underTest.setupCommunalHubLayout()
// Simluate attaching the view so flow collection starts.
- val onAttachStateChangeListenerArgumentCaptor = ArgumentCaptor.forClass(
- View.OnAttachStateChangeListener::class.java
- )
- verify(view, atLeast(1)).addOnAttachStateChangeListener(
- onAttachStateChangeListenerArgumentCaptor.capture()
- )
+ val onAttachStateChangeListenerArgumentCaptor =
+ ArgumentCaptor.forClass(View.OnAttachStateChangeListener::class.java)
+ verify(view, atLeast(1))
+ .addOnAttachStateChangeListener(onAttachStateChangeListenerArgumentCaptor.capture())
for (listener in onAttachStateChangeListenerArgumentCaptor.allValues) {
listener.onViewAttachedToWindow(view)
}
@@ -608,7 +550,7 @@ class NotificationShadeWindowViewControllerTest(flags: FlagsParameterization) :
@RequiresFlagsDisabled(Flags.FLAG_COMMUNAL_HUB)
fun doesNotSetupCommunalHubLayout_whenFlagDisabled() {
whenever(mGlanceableHubContainerController.communalAvailable())
- .thenReturn(MutableStateFlow(false))
+ .thenReturn(MutableStateFlow(false))
val mockCommunalPlaceholder = mock(View::class.java)
val fakeViewIndex = 20
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt
index ca29dd98a637..9093b2bcbbf8 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt
@@ -23,7 +23,6 @@ import android.widget.FrameLayout
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.keyguard.KeyguardSecurityContainerController
-import com.android.keyguard.LegacyLockIconViewController
import com.android.keyguard.dagger.KeyguardBouncerComponent
import com.android.systemui.Flags as AConfigFlags
import com.android.systemui.SysuiTestCase
@@ -57,7 +56,6 @@ import com.android.systemui.statusbar.notification.stack.NotificationStackScroll
import com.android.systemui.statusbar.phone.CentralSurfaces
import com.android.systemui.statusbar.phone.DozeScrimController
import com.android.systemui.statusbar.phone.DozeServiceHost
-import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager
import com.android.systemui.statusbar.window.StatusBarWindowStateController
import com.android.systemui.unfold.SysUIUnfoldComponent
import com.android.systemui.unfold.UnfoldTransitionProgressProvider
@@ -104,11 +102,9 @@ class NotificationShadeWindowViewTest : SysuiTestCase() {
@Mock
private lateinit var notificationStackScrollLayoutController:
NotificationStackScrollLayoutController
- @Mock private lateinit var statusBarKeyguardViewManager: StatusBarKeyguardViewManager
@Mock private lateinit var statusBarWindowStateController: StatusBarWindowStateController
@Mock
private lateinit var lockscreenShadeTransitionController: LockscreenShadeTransitionController
- @Mock private lateinit var lockIconViewController: LegacyLockIconViewController
@Mock private lateinit var keyguardUnlockAnimationController: KeyguardUnlockAnimationController
@Mock private lateinit var ambientState: AmbientState
@Mock private lateinit var shadeLogger: ShadeLogger
@@ -161,7 +157,6 @@ class NotificationShadeWindowViewTest : SysuiTestCase() {
val featureFlags = FakeFeatureFlags()
featureFlags.set(Flags.SPLIT_SHADE_SUBPIXEL_OPTIMIZATION, true)
featureFlags.set(Flags.LOCKSCREEN_WALLPAPER_DREAM_ENABLED, false)
- mSetFlagsRule.disableFlags(AConfigFlags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
mSetFlagsRule.enableFlags(AConfigFlags.FLAG_REVAMPED_BOUNCER_MESSAGES)
testScope = TestScope()
controller =
@@ -176,9 +171,7 @@ class NotificationShadeWindowViewTest : SysuiTestCase() {
panelExpansionInteractor,
ShadeExpansionStateManager(),
notificationStackScrollLayoutController,
- statusBarKeyguardViewManager,
statusBarWindowStateController,
- lockIconViewController,
centralSurfaces,
dozeServiceHost,
dozeScrimController,
@@ -221,48 +214,18 @@ class NotificationShadeWindowViewTest : SysuiTestCase() {
}
@Test
- fun testInterceptTouchWhenShowingAltAuth() =
- testScope.runTest {
- captureInteractionEventHandler()
-
- // WHEN showing alt auth, not dozing, drag down helper doesn't want to intercept
- whenever(statusBarStateController.isDozing).thenReturn(false)
- whenever(statusBarKeyguardViewManager.shouldInterceptTouchEvent(any())).thenReturn(true)
- whenever(dragDownHelper.onInterceptTouchEvent(any())).thenReturn(false)
-
- // THEN we should intercept touch
- assertThat(interactionEventHandler.shouldInterceptTouchEvent(mock())).isTrue()
- }
-
- @Test
fun testNoInterceptTouch() =
testScope.runTest {
captureInteractionEventHandler()
- // WHEN not showing alt auth, not dozing, drag down helper doesn't want to intercept
+ // WHEN not dozing, drag down helper doesn't want to intercept
whenever(statusBarStateController.isDozing).thenReturn(false)
- whenever(statusBarKeyguardViewManager.shouldInterceptTouchEvent(any()))
- .thenReturn(false)
whenever(dragDownHelper.onInterceptTouchEvent(any())).thenReturn(false)
// THEN we shouldn't intercept touch
assertThat(interactionEventHandler.shouldInterceptTouchEvent(mock())).isFalse()
}
- @Test
- fun testHandleTouchEventWhenShowingAltAuth() =
- testScope.runTest {
- captureInteractionEventHandler()
-
- // WHEN showing alt auth, not dozing, drag down helper doesn't want to intercept
- whenever(statusBarStateController.isDozing).thenReturn(false)
- whenever(statusBarKeyguardViewManager.onTouch(any())).thenReturn(true)
- whenever(dragDownHelper.onInterceptTouchEvent(any())).thenReturn(false)
-
- // THEN we should handle the touch
- assertThat(interactionEventHandler.handleTouchEvent(mock())).isTrue()
- }
-
private fun captureInteractionEventHandler() {
verify(underTest).setInteractionEventHandler(interactionEventHandlerCaptor.capture())
interactionEventHandler = interactionEventHandlerCaptor.value
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationListViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationListViewModelTest.kt
index 8d678ef00b4a..bf144729dea3 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationListViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationListViewModelTest.kt
@@ -21,7 +21,6 @@ package com.android.systemui.statusbar.notification.stack.ui.viewmodel
import android.platform.test.annotations.EnableFlags
import android.platform.test.flag.junit.FlagsParameterization
import androidx.test.filters.SmallTest
-import com.android.app.tracing.coroutines.flow.map
import com.android.systemui.SysuiTestCase
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.flags.DisableSceneContainer
@@ -51,6 +50,7 @@ import com.android.systemui.util.ui.isAnimating
import com.android.systemui.util.ui.value
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.map
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java
index 1d74331e429b..94753f7e5203 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java
@@ -34,7 +34,6 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -43,9 +42,7 @@ import android.platform.test.annotations.EnableFlags;
import android.platform.test.annotations.RequiresFlagsEnabled;
import android.platform.test.flag.junit.CheckFlagsRule;
import android.platform.test.flag.junit.DeviceFlagsValueProvider;
-import android.service.trust.TrustAgentService;
import android.testing.TestableLooper;
-import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewRootImpl;
@@ -67,7 +64,6 @@ import com.android.keyguard.KeyguardMessageAreaController;
import com.android.keyguard.KeyguardSecurityModel;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
-import com.android.keyguard.TrustGrantFlags;
import com.android.keyguard.ViewMediatorCallback;
import com.android.systemui.Flags;
import com.android.systemui.SysuiTestCase;
@@ -580,22 +576,6 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase {
}
@Test
- @DisableSceneContainer
- @DisableFlags(com.android.systemui.Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
- public void testShowAlternateBouncer_unlockingWithBiometricAllowed() {
- // GIVEN will show alternate bouncer
- when(mPrimaryBouncerInteractor.isFullyShowing()).thenReturn(false);
- when(mAlternateBouncerInteractor.show()).thenReturn(true);
-
- // WHEN showGenericBouncer is called
- mStatusBarKeyguardViewManager.showBouncer(true);
-
- // THEN alt auth bouncer is shown
- verify(mAlternateBouncerInteractor).show();
- verify(mPrimaryBouncerInteractor, never()).show(anyBoolean());
- }
-
- @Test
public void testUpdateResources_delegatesToBouncer() {
mStatusBarKeyguardViewManager.updateResources();
@@ -841,145 +821,6 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase {
}
@Test
- @EnableFlags(com.android.systemui.Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
- public void handleDispatchTouchEvent_alternateBouncerViewFlagEnabled() {
- mStatusBarKeyguardViewManager.addCallback(mCallback);
-
- // GIVEN alternate bouncer view flag enabled & the alternate bouncer is visible
- when(mAlternateBouncerInteractor.isVisibleState()).thenReturn(true);
-
- // THEN the touch is not acted upon
- verify(mCallback, never()).onTouch(any());
- }
-
- @Test
- @EnableFlags(com.android.systemui.Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
- public void onInterceptTouch_alternateBouncerViewFlagEnabled() {
- // GIVEN alternate bouncer view flag enabled & the alternate bouncer is visible
- when(mAlternateBouncerInteractor.isVisibleState()).thenReturn(true);
-
- // THEN the touch is not intercepted
- assertFalse(mStatusBarKeyguardViewManager.shouldInterceptTouchEvent(
- MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 0f, 0f, 0)
- ));
- }
-
- @Test
- public void handleDispatchTouchEvent_alternateBouncerNotVisible() {
- mStatusBarKeyguardViewManager.addCallback(mCallback);
-
- // GIVEN the alternate bouncer is visible
- when(mAlternateBouncerInteractor.isVisibleState()).thenReturn(false);
-
- // THEN handleDispatchTouchEvent doesn't use the touches
- assertFalse(mStatusBarKeyguardViewManager.dispatchTouchEvent(
- MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 0f, 0f, 0)
- ));
- assertFalse(mStatusBarKeyguardViewManager.dispatchTouchEvent(
- MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_UP, 0f, 0f, 0)
- ));
- assertFalse(mStatusBarKeyguardViewManager.dispatchTouchEvent(
- MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_MOVE, 0f, 0f, 0)
- ));
-
- // THEN the touch is not acted upon
- verify(mCallback, never()).onTouch(any());
- }
-
- @Test
- @DisableSceneContainer
- @DisableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
- public void handleDispatchTouchEvent_shouldInterceptTouchAndHandleTouch() {
- mStatusBarKeyguardViewManager.addCallback(mCallback);
-
- // GIVEN the alternate bouncer is visible
- when(mAlternateBouncerInteractor.isVisibleState()).thenReturn(true);
-
- // GIVEN all touches are NOT the udfps overlay
- when(mUdfpsOverlayInteractor.isTouchWithinUdfpsArea(any())).thenReturn(false);
-
- // THEN handleDispatchTouchEvent eats/intercepts the touches so motion events aren't sent
- // to its child views (handleDispatchTouchEvent returns true)
- assertTrue(mStatusBarKeyguardViewManager.dispatchTouchEvent(
- MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 0f, 0f, 0)
- ));
- assertTrue(mStatusBarKeyguardViewManager.dispatchTouchEvent(
- MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_UP, 0f, 0f, 0)
- ));
- assertTrue(mStatusBarKeyguardViewManager.dispatchTouchEvent(
- MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_MOVE, 0f, 0f, 0)
- ));
-
- // THEN the touch is acted upon once for each dispatchTOuchEvent call
- verify(mCallback, times(3)).onTouch(any());
- }
-
- @Test
- @DisableSceneContainer
- @DisableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
- public void handleDispatchTouchEvent_shouldInterceptTouchButNotHandleTouch() {
- mStatusBarKeyguardViewManager.addCallback(mCallback);
-
- // GIVEN the alternate bouncer is visible
- when(mAlternateBouncerInteractor.isVisibleState()).thenReturn(true);
-
- // GIVEN all touches are within the udfps overlay
- when(mUdfpsOverlayInteractor.isTouchWithinUdfpsArea(any())).thenReturn(true);
-
- // THEN handleDispatchTouchEvent eats/intercepts the touches so motion events aren't sent
- // to its child views (handleDispatchTouchEvent returns true)
- assertTrue(mStatusBarKeyguardViewManager.dispatchTouchEvent(
- MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 0f, 0f, 0)
- ));
- assertTrue(mStatusBarKeyguardViewManager.dispatchTouchEvent(
- MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_UP, 0f, 0f, 0)
- ));
- assertTrue(mStatusBarKeyguardViewManager.dispatchTouchEvent(
- MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_MOVE, 0f, 0f, 0)
- ));
-
- // THEN the touch is NOT acted upon at the moment
- verify(mCallback, never()).onTouch(any());
- }
-
- @Test
- @DisableSceneContainer
- public void shouldInterceptTouch_alternateBouncerNotVisible() {
- // GIVEN the alternate bouncer is not visible
- when(mAlternateBouncerInteractor.isVisibleState()).thenReturn(false);
-
- // THEN no motion events are intercepted
- assertFalse(mStatusBarKeyguardViewManager.shouldInterceptTouchEvent(
- MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 0f, 0f, 0)
- ));
- assertFalse(mStatusBarKeyguardViewManager.shouldInterceptTouchEvent(
- MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_UP, 0f, 0f, 0)
- ));
- assertFalse(mStatusBarKeyguardViewManager.shouldInterceptTouchEvent(
- MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_MOVE, 0f, 0f, 0)
- ));
- }
-
- @Test
- @DisableSceneContainer
- @DisableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
- public void shouldInterceptTouch_alternateBouncerVisible() {
- // GIVEN the alternate bouncer is visible
- when(mAlternateBouncerInteractor.isVisibleState()).thenReturn(true);
-
- // THEN all motion events are intercepted
- assertTrue(mStatusBarKeyguardViewManager.shouldInterceptTouchEvent(
- MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 0f, 0f, 0)
- ));
- assertTrue(mStatusBarKeyguardViewManager.shouldInterceptTouchEvent(
- MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_UP, 0f, 0f, 0)
- ));
- assertTrue(mStatusBarKeyguardViewManager.shouldInterceptTouchEvent(
- MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_MOVE, 0f, 0f, 0)
- ));
- }
-
- @Test
public void alternateBouncerToShowPrimaryBouncer_updatesScrimControllerOnce() {
// GIVEN the alternate bouncer has shown and calls to hide() will result in successfully
// hiding it
@@ -997,106 +838,6 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase {
@Test
@DisableSceneContainer
- @DisableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
- public void alternateBouncerOnTouch_actionDownThenUp_noMinTimeShown_noHideAltBouncer() {
- reset(mAlternateBouncerInteractor);
-
- // GIVEN the alternate bouncer has shown for a minimum amount of time
- when(mAlternateBouncerInteractor.hasAlternateBouncerShownWithMinTime()).thenReturn(false);
- when(mAlternateBouncerInteractor.isVisibleState()).thenReturn(true);
- when(mUdfpsOverlayInteractor.isTouchWithinUdfpsArea(any())).thenReturn(false);
-
- // WHEN ACTION_DOWN and ACTION_UP touch event comes
- boolean touchHandledDown = mStatusBarKeyguardViewManager.onTouch(
- MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 0f, 0f, 0));
- when(mAlternateBouncerInteractor.getReceivedDownTouch()).thenReturn(true);
- boolean touchHandledUp = mStatusBarKeyguardViewManager.onTouch(
- MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_UP, 0f, 0f, 0));
-
- // THEN the touches are handled (doesn't let touches through to underlying views)
- assertTrue(touchHandledDown);
- assertTrue(touchHandledUp);
-
- // THEN alternate bouncer does NOT attempt to hide since min showing time wasn't met
- verify(mAlternateBouncerInteractor, never()).hide();
- }
-
- @Test
- @DisableSceneContainer
- @DisableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
- public void alternateBouncerOnTouch_actionDownThenUp_handlesTouch_hidesAltBouncer() {
- reset(mAlternateBouncerInteractor);
-
- // GIVEN the alternate bouncer has shown for a minimum amount of time
- when(mAlternateBouncerInteractor.hasAlternateBouncerShownWithMinTime()).thenReturn(true);
- when(mAlternateBouncerInteractor.isVisibleState()).thenReturn(true);
- when(mUdfpsOverlayInteractor.isTouchWithinUdfpsArea(any())).thenReturn(false);
-
- // WHEN ACTION_DOWN and ACTION_UP touch event comes
- boolean touchHandledDown = mStatusBarKeyguardViewManager.onTouch(
- MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 0f, 0f, 0));
- when(mAlternateBouncerInteractor.getReceivedDownTouch()).thenReturn(true);
- boolean touchHandledUp = mStatusBarKeyguardViewManager.onTouch(
- MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_UP, 0f, 0f, 0));
-
- // THEN the touches are handled
- assertTrue(touchHandledDown);
- assertTrue(touchHandledUp);
-
- // THEN alternate bouncer attempts to hide
- verify(mAlternateBouncerInteractor).hide();
- }
-
- @Test
- @DisableSceneContainer
- public void alternateBouncerOnTouch_actionUp_doesNotHideAlternateBouncer() {
- reset(mAlternateBouncerInteractor);
-
- // GIVEN the alternate bouncer has shown for a minimum amount of time
- when(mAlternateBouncerInteractor.hasAlternateBouncerShownWithMinTime()).thenReturn(true);
- when(mAlternateBouncerInteractor.isVisibleState()).thenReturn(true);
- when(mUdfpsOverlayInteractor.isTouchWithinUdfpsArea(any())).thenReturn(false);
-
- // WHEN only ACTION_UP touch event comes
- mStatusBarKeyguardViewManager.onTouch(
- MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_UP, 0f, 0f, 0));
-
- // THEN the alternateBouncer doesn't hide
- verify(mAlternateBouncerInteractor, never()).hide();
- }
-
- @Test
- @DisableSceneContainer
- @DisableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
- public void onTrustChanged_hideAlternateBouncerAndClearMessageArea() {
- // GIVEN keyguard update monitor callback is registered
- verify(mKeyguardUpdateMonitor).registerCallback(mKeyguardUpdateMonitorCallback.capture());
-
- reset(mKeyguardUpdateMonitor);
- reset(mKeyguardMessageAreaController);
-
- // GIVEN alternate bouncer state = not visible
- when(mAlternateBouncerInteractor.isVisibleState()).thenReturn(false);
-
- // WHEN the device is trusted by active unlock
- mKeyguardUpdateMonitorCallback.getValue().onTrustGrantedForCurrentUser(
- true,
- true,
- new TrustGrantFlags(TrustAgentService.FLAG_GRANT_TRUST_DISMISS_KEYGUARD
- | TrustAgentService.FLAG_GRANT_TRUST_TEMPORARY_AND_RENEWABLE),
- null
- );
-
- // THEN the false visibility state is propagated to the keyguardUpdateMonitor
- verify(mKeyguardUpdateMonitor).setAlternateBouncerShowing(eq(false));
-
- // THEN message area visibility updated to FALSE with empty message
- verify(mKeyguardMessageAreaController).setIsVisible(eq(false));
- verify(mKeyguardMessageAreaController).setMessage(eq(""));
- }
-
- @Test
- @DisableSceneContainer
@DisableFlags(Flags.FLAG_SIM_PIN_RACE_CONDITION_ON_RESTART)
public void testShowBouncerOrKeyguard_needsFullScreen() {
when(mKeyguardSecurityModel.getSecurityMode(anyInt())).thenReturn(
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/util/drawable/DrawableSizeTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/util/drawable/DrawableSizeTest.kt
index b8f581574848..a4b3916b7a55 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/util/drawable/DrawableSizeTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/util/drawable/DrawableSizeTest.kt
@@ -35,7 +35,7 @@ class DrawableSizeTest : SysuiTestCase() {
val drawable =
BitmapDrawable(
resources,
- Bitmap.createBitmap(resources.displayMetrics, 150, 150, Bitmap.Config.ARGB_8888)
+ Bitmap.createBitmap(resources.displayMetrics, 150, 150, Bitmap.Config.ARGB_8888),
)
val result = DrawableSize.downscaleToSize(resources, drawable, 300, 300)
assertThat(result).isSameInstanceAs(drawable)
@@ -48,7 +48,7 @@ class DrawableSizeTest : SysuiTestCase() {
val drawable =
BitmapDrawable(
resources,
- Bitmap.createBitmap(resources.displayMetrics, 150, 75, Bitmap.Config.ARGB_8888)
+ Bitmap.createBitmap(resources.displayMetrics, 150, 75, Bitmap.Config.ARGB_8888),
)
val result = DrawableSize.downscaleToSize(resources, drawable, 75, 75)
@@ -64,4 +64,31 @@ class DrawableSizeTest : SysuiTestCase() {
val result = DrawableSize.downscaleToSize(resources, drawable, 1, 1)
assertThat(result).isSameInstanceAs(drawable)
}
+
+ @Test
+ fun testDownscaleToSize_layerDrawable_allLayersSameType_resized() {
+ val drawable =
+ resources.getDrawable(
+ com.android.systemui.tests.R.drawable.layer_drawable_all_same_type,
+ resources.newTheme(),
+ )
+
+ val result = DrawableSize.downscaleToSize(resources, drawable, 1, 1)
+
+ assertThat(result).isNotSameInstanceAs(drawable)
+ }
+
+ /** Regression test for b/244282477. */
+ @Test
+ fun testDownscaleToSize_layerDrawable_layersAreDifferentTypes_unchanged() {
+ val drawable =
+ resources.getDrawable(
+ com.android.systemui.tests.R.drawable.layer_drawable_different_types,
+ resources.newTheme(),
+ )
+
+ val result = DrawableSize.downscaleToSize(resources, drawable, 1, 1)
+
+ assertThat(result).isSameInstanceAs(drawable)
+ }
}
diff --git a/packages/SystemUI/res/layout/super_notification_shade.xml b/packages/SystemUI/res/layout/super_notification_shade.xml
index 22d34eb7b115..fbb07bed4b50 100644
--- a/packages/SystemUI/res/layout/super_notification_shade.xml
+++ b/packages/SystemUI/res/layout/super_notification_shade.xml
@@ -58,22 +58,22 @@
android:layout_height="match_parent"
android:visibility="invisible" />
- <!-- Shared container for the notification stack. Can be positioned by either
- the keyguard_root_view or notification_panel -->
- <com.android.systemui.statusbar.notification.stack.ui.view.SharedNotificationContainer
- android:id="@+id/shared_notification_container"
+ <!-- Root for all keyguard content. It was previously located within the shade. -->
+ <com.android.systemui.keyguard.ui.view.KeyguardRootView
+ android:id="@id/keyguard_root_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false"
- android:clipToPadding="false"
/>
- <!-- Root for all keyguard content. It was previously located within the shade. -->
- <com.android.systemui.keyguard.ui.view.KeyguardRootView
- android:id="@id/keyguard_root_view"
+ <!-- Shared container for the notification stack. Can be positioned by either
+ the keyguard_root_view or notification_panel -->
+ <com.android.systemui.statusbar.notification.stack.ui.view.SharedNotificationContainer
+ android:id="@+id/shared_notification_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false"
+ android:clipToPadding="false"
/>
<include layout="@layout/brightness_mirror_container" />
diff --git a/packages/SystemUI/res/layout/udfps_fpm_empty_view.xml b/packages/SystemUI/res/layout/udfps_fpm_empty_view.xml
deleted file mode 100644
index 4799f8c5b668..000000000000
--- a/packages/SystemUI/res/layout/udfps_fpm_empty_view.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2021 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.
- -->
-<com.android.systemui.biometrics.UdfpsFpmEmptyView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/udfps_animation_view"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
- <!-- The layout height/width are placeholders, which will be overwritten by
- FingerprintSensorPropertiesInternal. -->
- <View
- android:id="@+id/udfps_enroll_accessibility_view"
- android:layout_gravity="center"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:contentDescription="@string/accessibility_fingerprint_label"/>
-</com.android.systemui.biometrics.UdfpsFpmEmptyView>
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsBpView.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsBpView.kt
deleted file mode 100644
index 242601d46fa4..000000000000
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsBpView.kt
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2021 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 com.android.systemui.biometrics
-
-import android.content.Context
-import android.util.AttributeSet
-
-/**
- * Class that coordinates non-HBM animations during BiometricPrompt.
- *
- * Currently doesn't draw anything.
- *
- * Note that [AuthBiometricFingerprintViewController] also shows UDFPS animations. At some point we should
- * de-dupe this if necessary.
- */
-class UdfpsBpView(context: Context, attrs: AttributeSet?) : UdfpsAnimationView(context, attrs) {
-
- // Drawable isn't ever added to the view, so we don't currently show anything
- private val fingerprintDrawable: UdfpsFpDrawable = UdfpsFpDrawable(context)
-
- override fun getDrawable(): UdfpsDrawable = fingerprintDrawable
-}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsBpViewController.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsBpViewController.kt
deleted file mode 100644
index e0455b58b919..000000000000
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsBpViewController.kt
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2021 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 com.android.systemui.biometrics
-
-import com.android.systemui.biometrics.domain.interactor.UdfpsOverlayInteractor
-import com.android.systemui.dump.DumpManager
-import com.android.systemui.plugins.statusbar.StatusBarStateController
-import com.android.systemui.shade.domain.interactor.ShadeInteractor
-import com.android.systemui.statusbar.phone.SystemUIDialogManager
-
-/**
- * Class that coordinates non-HBM animations for biometric prompt.
- */
-class UdfpsBpViewController(
- view: UdfpsBpView,
- statusBarStateController: StatusBarStateController,
- shadeInteractor: ShadeInteractor,
- systemUIDialogManager: SystemUIDialogManager,
- dumpManager: DumpManager,
- udfpsOverlayInteractor: UdfpsOverlayInteractor,
-) : UdfpsAnimationViewController<UdfpsBpView>(
- view,
- statusBarStateController,
- shadeInteractor,
- systemUIDialogManager,
- dumpManager,
- udfpsOverlayInteractor,
-) {
- override val tag = "UdfpsBpViewController"
-
- override fun shouldPauseAuth(): Boolean {
- return false
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
index a3904caa9dcc..2863e29c9a34 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
@@ -87,7 +87,6 @@ import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Application;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFaceAuthInteractor;
-import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor;
import com.android.systemui.doze.DozeReceiver;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.ScreenLifecycle;
@@ -98,7 +97,6 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.power.domain.interactor.PowerInteractor;
import com.android.systemui.shade.domain.interactor.ShadeInteractor;
import com.android.systemui.shared.system.SysUiStatsLog;
-import com.android.systemui.statusbar.LockscreenShadeTransitionController;
import com.android.systemui.statusbar.VibratorHelper;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.phone.SystemUIDialogManager;
@@ -162,7 +160,6 @@ public class UdfpsController implements DozeReceiver, Dumpable {
@NonNull private final FalsingManager mFalsingManager;
@NonNull private final PowerManager mPowerManager;
@NonNull private final AccessibilityManager mAccessibilityManager;
- @NonNull private final LockscreenShadeTransitionController mLockscreenShadeTransitionController;
@NonNull private final ConfigurationController mConfigurationController;
@NonNull private final SystemClock mSystemClock;
@NonNull private final UnlockedScreenOffAnimationController
@@ -283,7 +280,6 @@ public class UdfpsController implements DozeReceiver, Dumpable {
mKeyguardUpdateMonitor,
mDialogManager,
mDumpManager,
- mLockscreenShadeTransitionController,
mConfigurationController,
mKeyguardStateController,
mUnlockedScreenOffAnimationController,
@@ -291,10 +287,9 @@ public class UdfpsController implements DozeReceiver, Dumpable {
requestId,
reason,
callback,
- (view, event, fromUdfpsView) -> onTouch(
+ (view, event) -> onTouch(
requestId,
- event,
- fromUdfpsView
+ event
),
mActivityTransitionAnimator,
mPrimaryBouncerInteractor,
@@ -374,9 +369,6 @@ public class UdfpsController implements DozeReceiver, Dumpable {
if (mOverlay == null || mOverlay.isHiding()) {
return;
}
- if (!DeviceEntryUdfpsRefactor.isEnabled()) {
- ((UdfpsView) mOverlay.getTouchOverlay()).setDebugMessage(message);
- }
});
}
@@ -391,7 +383,7 @@ public class UdfpsController implements DozeReceiver, Dumpable {
*/
public void debugOnTouch(MotionEvent event) {
final long requestId = (mOverlay != null) ? mOverlay.getRequestId() : 0L;
- UdfpsController.this.onTouch(requestId, event, true);
+ UdfpsController.this.onTouch(requestId, event);
}
/**
@@ -449,22 +441,10 @@ public class UdfpsController implements DozeReceiver, Dumpable {
if (!mOverlayParams.equals(overlayParams)) {
mOverlayParams = overlayParams;
- if (DeviceEntryUdfpsRefactor.isEnabled()) {
- if (mOverlay != null && mOverlay.getRequestReason() == REASON_AUTH_KEYGUARD) {
- mOverlay.updateOverlayParams(mOverlayParams);
- } else {
- redrawOverlay();
- }
+ if (mOverlay != null && mOverlay.getRequestReason() == REASON_AUTH_KEYGUARD) {
+ mOverlay.updateOverlayParams(mOverlayParams);
} else {
- final boolean wasShowingAlternateBouncer =
- mAlternateBouncerInteractor.isVisibleState();
- // When the bounds change it's always to re-create the overlay's window with new
- // LayoutParams. If the overlay needs to be shown, this will re-create and show the
- // overlay with the updated LayoutParams. Otherwise, the overlay will remain hidden.
redrawOverlay();
- if (wasShowingAlternateBouncer) {
- mKeyguardViewManager.showBouncer(true);
- }
}
}
}
@@ -563,11 +543,7 @@ public class UdfpsController implements DozeReceiver, Dumpable {
}
}
- private boolean onTouch(long requestId, @NonNull MotionEvent event, boolean fromUdfpsView) {
- if (!fromUdfpsView) {
- Log.e(TAG, "ignoring the touch injected from outside of UdfpsView");
- return false;
- }
+ private boolean onTouch(long requestId, @NonNull MotionEvent event) {
if (mOverlay == null) {
Log.w(TAG, "ignoring onTouch with null overlay");
return false;
@@ -591,13 +567,6 @@ public class UdfpsController implements DozeReceiver, Dumpable {
if (!mIsAodInterruptActive) {
mOnFingerDown = false;
}
- } else if (!DeviceEntryUdfpsRefactor.isEnabled()) {
- if ((mLockscreenShadeTransitionController.getQSDragProgress() != 0f
- && !mAlternateBouncerInteractor.isVisibleState())
- || mPrimaryBouncerInteractor.isInTransit()) {
- Log.w(TAG, "ignoring touch due to qsDragProcess or primaryBouncerInteractor");
- return false;
- }
}
final TouchProcessorResult result = mTouchProcessor.processTouch(event, mActivePointerId,
@@ -661,22 +630,13 @@ public class UdfpsController implements DozeReceiver, Dumpable {
mStatusBarStateController.isDozing());
break;
- case UNCHANGED:
- if (mActivePointerId == MotionEvent.INVALID_POINTER_ID
- && mAlternateBouncerInteractor.isVisibleState()) {
- // No pointer on sensor, forward to keyguard if alternateBouncer is visible
- mKeyguardViewManager.onTouch(event);
- }
-
default:
break;
}
logBiometricTouch(processedTouch.getEvent(), data);
// Always pilfer pointers that are within sensor area or when alternate bouncer is showing
- if (mActivePointerId != MotionEvent.INVALID_POINTER_ID
- || (mAlternateBouncerInteractor.isVisibleState()
- && !DeviceEntryUdfpsRefactor.isEnabled())) {
+ if (mActivePointerId != MotionEvent.INVALID_POINTER_ID) {
shouldPilfer = true;
}
@@ -692,14 +652,7 @@ public class UdfpsController implements DozeReceiver, Dumpable {
}
private boolean shouldTryToDismissKeyguard() {
- boolean onKeyguard = false;
- if (DeviceEntryUdfpsRefactor.isEnabled()) {
- onKeyguard = mKeyguardStateController.isShowing();
- } else {
- onKeyguard = mOverlay != null
- && mOverlay.getAnimationViewController()
- instanceof UdfpsKeyguardViewControllerLegacy;
- }
+ boolean onKeyguard = mKeyguardStateController.isShowing();
return onKeyguard
&& mKeyguardStateController.canDismissLockScreen()
&& !mAttemptedToDismissKeyguard;
@@ -719,7 +672,6 @@ public class UdfpsController implements DozeReceiver, Dumpable {
@NonNull FalsingManager falsingManager,
@NonNull PowerManager powerManager,
@NonNull AccessibilityManager accessibilityManager,
- @NonNull LockscreenShadeTransitionController lockscreenShadeTransitionController,
@NonNull ScreenLifecycle screenLifecycle,
@NonNull VibratorHelper vibrator,
@NonNull UdfpsHapticsSimulator udfpsHapticsSimulator,
@@ -769,7 +721,6 @@ public class UdfpsController implements DozeReceiver, Dumpable {
mFalsingManager = falsingManager;
mPowerManager = powerManager;
mAccessibilityManager = accessibilityManager;
- mLockscreenShadeTransitionController = lockscreenShadeTransitionController;
screenLifecycle.addObserver(mScreenObserver);
mScreenOn = screenLifecycle.getScreenState() == ScreenLifecycle.SCREEN_ON;
mConfigurationController = configurationController;
@@ -849,13 +800,7 @@ public class UdfpsController implements DozeReceiver, Dumpable {
@Override
public void dozeTimeTick() {
- if (mOverlay != null && mOverlay.getTouchOverlay() instanceof UdfpsView) {
- DeviceEntryUdfpsRefactor.assertInLegacyMode();
- final View view = mOverlay.getTouchOverlay();
- if (view != null) {
- ((UdfpsView) view).dozeTimeTick();
- }
- }
+
}
private void redrawOverlay() {
@@ -915,17 +860,8 @@ public class UdfpsController implements DozeReceiver, Dumpable {
if (!isOptical()) {
return;
}
- if (DeviceEntryUdfpsRefactor.isEnabled()) {
- if (mUdfpsDisplayMode != null) {
- mUdfpsDisplayMode.disable(null);
- }
- } else {
- if (view != null) {
- UdfpsView udfpsView = (UdfpsView) view;
- if (udfpsView.isDisplayConfigured()) {
- udfpsView.unconfigureDisplay();
- }
- }
+ if (mUdfpsDisplayMode != null) {
+ mUdfpsDisplayMode.disable(null);
}
}
@@ -1118,11 +1054,7 @@ public class UdfpsController implements DozeReceiver, Dumpable {
if (mIgnoreRefreshRate) {
dispatchOnUiReady(requestId);
} else {
- if (DeviceEntryUdfpsRefactor.isEnabled()) {
mUdfpsDisplayMode.enable(() -> dispatchOnUiReady(requestId));
- } else {
- ((UdfpsView) view).configureDisplay(() -> dispatchOnUiReady(requestId));
- }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt
index 1bac0bc26a94..a1efc196dbee 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt
@@ -23,8 +23,6 @@ import android.graphics.PixelFormat
import android.graphics.Rect
import android.hardware.biometrics.BiometricRequestConstants.REASON_AUTH_BP
import android.hardware.biometrics.BiometricRequestConstants.REASON_AUTH_KEYGUARD
-import android.hardware.biometrics.BiometricRequestConstants.REASON_AUTH_OTHER
-import android.hardware.biometrics.BiometricRequestConstants.REASON_AUTH_SETTINGS
import android.hardware.biometrics.BiometricRequestConstants.REASON_ENROLL_ENROLLING
import android.hardware.biometrics.BiometricRequestConstants.REASON_ENROLL_FIND_SENSOR
import android.hardware.biometrics.BiometricRequestConstants.RequestReason
@@ -42,7 +40,6 @@ import android.view.View
import android.view.WindowManager
import android.view.accessibility.AccessibilityManager
import android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener
-import androidx.annotation.LayoutRes
import androidx.annotation.VisibleForTesting
import com.android.app.viewcapture.ViewCaptureAwareWindowManager
import com.android.keyguard.KeyguardUpdateMonitor
@@ -56,7 +53,6 @@ import com.android.systemui.biometrics.ui.viewmodel.DeviceEntryUdfpsTouchOverlay
import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor
import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor
import com.android.systemui.dagger.qualifiers.Application
-import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor
import com.android.systemui.dump.DumpManager
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
import com.android.systemui.keyguard.shared.model.KeyguardState
@@ -64,7 +60,6 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.power.domain.interactor.PowerInteractor
import com.android.systemui.res.R
import com.android.systemui.shade.domain.interactor.ShadeInteractor
-import com.android.systemui.statusbar.LockscreenShadeTransitionController
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager
import com.android.systemui.statusbar.phone.SystemUIDialogManager
import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController
@@ -102,7 +97,6 @@ constructor(
private val keyguardUpdateMonitor: KeyguardUpdateMonitor,
private val dialogManager: SystemUIDialogManager,
private val dumpManager: DumpManager,
- private val transitionController: LockscreenShadeTransitionController,
private val configurationController: ConfigurationController,
private val keyguardStateController: KeyguardStateController,
private val unlockedScreenOffAnimationController: UnlockedScreenOffAnimationController,
@@ -110,7 +104,7 @@ constructor(
val requestId: Long,
@RequestReason val requestReason: Int,
private val controllerCallback: IUdfpsOverlayControllerCallback,
- private val onTouch: (View, MotionEvent, Boolean) -> Boolean,
+ private val onTouch: (View, MotionEvent) -> Boolean,
private val activityTransitionAnimator: ActivityTransitionAnimator,
private val primaryBouncerInteractor: PrimaryBouncerInteractor,
private val alternateBouncerInteractor: AlternateBouncerInteractor,
@@ -133,23 +127,15 @@ constructor(
.map {} // map to Unit
private var listenForCurrentKeyguardState: Job? = null
private var addViewRunnable: Runnable? = null
- private var overlayViewLegacy: UdfpsView? = null
- private set
-
private var overlayTouchView: UdfpsTouchOverlay? = null
/**
- * Get the current UDFPS overlay touch view which is a different View depending on whether the
- * DeviceEntryUdfpsRefactor flag is enabled or not.
+ * Get the current UDFPS overlay touch view
*
* @return The view, when [isShowing], else null
*/
fun getTouchOverlay(): View? {
- return if (DeviceEntryUdfpsRefactor.isEnabled) {
- overlayTouchView
- } else {
- overlayViewLegacy
- }
+ return overlayTouchView
}
private var overlayParams: UdfpsOverlayParams = UdfpsOverlayParams()
@@ -161,7 +147,7 @@ constructor(
WindowManager.LayoutParams(
WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
0 /* flags set in computeLayoutParams() */,
- PixelFormat.TRANSLUCENT
+ PixelFormat.TRANSLUCENT,
)
.apply {
title = TAG
@@ -188,10 +174,6 @@ constructor(
val isHiding: Boolean
get() = getTouchOverlay() == null
- /** The animation controller if the overlay [isShowing]. */
- val animationViewController: UdfpsAnimationViewController<*>?
- get() = overlayViewLegacy?.animationViewController
-
private var touchExplorationEnabled = false
private fun shouldRemoveEnrollmentUi(): Boolean {
@@ -199,7 +181,7 @@ constructor(
return Settings.Global.getInt(
context.contentResolver,
SETTING_REMOVE_ENROLLMENT_UI,
- 0 /* def */
+ 0, /* def */
) != 0
}
return false
@@ -212,63 +194,43 @@ constructor(
overlayParams = params
sensorBounds = Rect(params.sensorBounds)
try {
- if (DeviceEntryUdfpsRefactor.isEnabled) {
- overlayTouchView =
- (inflater.inflate(R.layout.udfps_touch_overlay, null, false)
- as UdfpsTouchOverlay)
- .apply {
- // This view overlaps the sensor area
- // prevent it from being selectable during a11y
- if (requestReason.isImportantForAccessibility()) {
- importantForAccessibility = View.IMPORTANT_FOR_ACCESSIBILITY_NO
- }
-
- addViewNowOrLater(this, null)
- when (requestReason) {
- REASON_AUTH_KEYGUARD ->
- UdfpsTouchOverlayBinder.bind(
- view = this,
- viewModel = deviceEntryUdfpsTouchOverlayViewModel.get(),
- udfpsOverlayInteractor = udfpsOverlayInteractor,
- )
- else ->
- UdfpsTouchOverlayBinder.bind(
- view = this,
- viewModel = defaultUdfpsTouchOverlayViewModel.get(),
- udfpsOverlayInteractor = udfpsOverlayInteractor,
- )
- }
- }
- } else {
- overlayViewLegacy =
- (inflater.inflate(R.layout.udfps_view, null, false) as UdfpsView).apply {
- overlayParams = params
- setUdfpsDisplayModeProvider(udfpsDisplayModeProvider)
- val animation = inflateUdfpsAnimation(this, controller)
- if (animation != null) {
- animation.init()
- animationViewController = animation
- }
+ overlayTouchView =
+ (inflater.inflate(R.layout.udfps_touch_overlay, null, false)
+ as UdfpsTouchOverlay)
+ .apply {
// This view overlaps the sensor area
// prevent it from being selectable during a11y
if (requestReason.isImportantForAccessibility()) {
importantForAccessibility = View.IMPORTANT_FOR_ACCESSIBILITY_NO
}
- addViewNowOrLater(this, animation)
- sensorRect = sensorBounds
+ addViewNowOrLater(this, null)
+ when (requestReason) {
+ REASON_AUTH_KEYGUARD ->
+ UdfpsTouchOverlayBinder.bind(
+ view = this,
+ viewModel = deviceEntryUdfpsTouchOverlayViewModel.get(),
+ udfpsOverlayInteractor = udfpsOverlayInteractor,
+ )
+ else ->
+ UdfpsTouchOverlayBinder.bind(
+ view = this,
+ viewModel = defaultUdfpsTouchOverlayViewModel.get(),
+ udfpsOverlayInteractor = udfpsOverlayInteractor,
+ )
+ }
}
- }
+
getTouchOverlay()?.apply {
touchExplorationEnabled = accessibilityManager.isTouchExplorationEnabled
overlayTouchListener = TouchExplorationStateChangeListener {
if (accessibilityManager.isTouchExplorationEnabled) {
- setOnHoverListener { v, event -> onTouch(v, event, true) }
+ setOnHoverListener { v, event -> onTouch(v, event) }
setOnTouchListener(null)
touchExplorationEnabled = true
} else {
setOnHoverListener(null)
- setOnTouchListener { v, event -> onTouch(v, event, true) }
+ setOnTouchListener { v, event -> onTouch(v, event) }
touchExplorationEnabled = false
}
}
@@ -312,7 +274,6 @@ constructor(
}
fun updateOverlayParams(updatedOverlayParams: UdfpsOverlayParams) {
- DeviceEntryUdfpsRefactor.isUnexpectedlyInLegacyMode()
overlayParams = updatedOverlayParams
sensorBounds = updatedOverlayParams.sensorBounds
getTouchOverlay()?.let {
@@ -326,108 +287,11 @@ constructor(
}
}
- fun inflateUdfpsAnimation(
- view: UdfpsView,
- controller: UdfpsController
- ): UdfpsAnimationViewController<*>? {
- DeviceEntryUdfpsRefactor.assertInLegacyMode()
-
- val isEnrollment =
- when (requestReason) {
- REASON_ENROLL_FIND_SENSOR,
- REASON_ENROLL_ENROLLING -> true
- else -> false
- }
-
- val filteredRequestReason =
- if (isEnrollment && shouldRemoveEnrollmentUi()) {
- REASON_AUTH_OTHER
- } else {
- requestReason
- }
-
- return when (filteredRequestReason) {
- REASON_ENROLL_FIND_SENSOR,
- REASON_ENROLL_ENROLLING -> {
- // Enroll udfps UI is handled by settings, so use empty view here
- UdfpsFpmEmptyViewController(
- view.addUdfpsView(R.layout.udfps_fpm_empty_view) {
- updateAccessibilityViewLocation(sensorBounds)
- },
- statusBarStateController,
- shadeInteractor,
- dialogManager,
- dumpManager,
- udfpsOverlayInteractor,
- )
- }
- REASON_AUTH_KEYGUARD -> {
- UdfpsKeyguardViewControllerLegacy(
- view.addUdfpsView(R.layout.udfps_keyguard_view_legacy) {
- updateSensorLocation(sensorBounds)
- },
- statusBarStateController,
- statusBarKeyguardViewManager,
- keyguardUpdateMonitor,
- dumpManager,
- transitionController,
- configurationController,
- keyguardStateController,
- unlockedScreenOffAnimationController,
- dialogManager,
- controller,
- activityTransitionAnimator,
- primaryBouncerInteractor,
- alternateBouncerInteractor,
- udfpsKeyguardAccessibilityDelegate,
- selectedUserInteractor,
- transitionInteractor,
- shadeInteractor,
- udfpsOverlayInteractor,
- )
- }
- REASON_AUTH_BP -> {
- // note: empty controller, currently shows no visual affordance
- UdfpsBpViewController(
- view.addUdfpsView(R.layout.udfps_bp_view),
- statusBarStateController,
- shadeInteractor,
- dialogManager,
- dumpManager,
- udfpsOverlayInteractor,
- )
- }
- REASON_AUTH_OTHER,
- REASON_AUTH_SETTINGS -> {
- UdfpsFpmEmptyViewController(
- view.addUdfpsView(R.layout.udfps_fpm_empty_view),
- statusBarStateController,
- shadeInteractor,
- dialogManager,
- dumpManager,
- udfpsOverlayInteractor,
- )
- }
- else -> {
- Log.e(TAG, "Animation for reason $requestReason not supported yet")
- null
- }
- }
- }
-
/** Hide the overlay or return false and do nothing if it is already hidden. */
fun hide(): Boolean {
val wasShowing = isShowing
- overlayViewLegacy?.apply {
- if (isDisplayConfigured) {
- unconfigureDisplay()
- }
- animationViewController = null
- }
- if (DeviceEntryUdfpsRefactor.isEnabled) {
- udfpsDisplayModeProvider.disable(null)
- }
+ udfpsDisplayModeProvider.disable(null)
getTouchOverlay()?.apply {
if (this.parent != null) {
windowManager.removeView(this)
@@ -440,7 +304,6 @@ constructor(
}
}
- overlayViewLegacy = null
overlayTouchView = null
overlayTouchListener = null
listenForCurrentKeyguardState?.cancel()
@@ -490,7 +353,7 @@ constructor(
Surface.rotationToString(rot) +
" animation=$animation" +
" isGoingToSleep=${keyguardUpdateMonitor.isGoingToSleep}" +
- " isOccluded=${keyguardStateController.isOccluded}"
+ " isOccluded=${keyguardStateController.isOccluded}",
)
} else {
Log.v(TAG, "Rotate UDFPS bounds " + Surface.rotationToString(rot))
@@ -498,14 +361,14 @@ constructor(
rotatedBounds,
overlayParams.naturalDisplayWidth,
overlayParams.naturalDisplayHeight,
- rot
+ rot,
)
RotationUtils.rotateBounds(
sensorBounds,
overlayParams.naturalDisplayWidth,
overlayParams.naturalDisplayHeight,
- rot
+ rot,
)
}
}
@@ -519,14 +382,7 @@ constructor(
}
private fun shouldRotate(animation: UdfpsAnimationViewController<*>?): Boolean {
- val keyguardNotShowing =
- if (DeviceEntryUdfpsRefactor.isEnabled) {
- !keyguardStateController.isShowing
- } else {
- animation !is UdfpsKeyguardViewControllerLegacy
- }
-
- if (keyguardNotShowing) {
+ if (!keyguardStateController.isShowing) {
// always rotate view if we're not on the keyguard
return true
}
@@ -534,16 +390,6 @@ constructor(
// on the keyguard, make sure we don't rotate if we're going to sleep or not occluded
return !(keyguardUpdateMonitor.isGoingToSleep || !keyguardStateController.isOccluded)
}
-
- private inline fun <reified T : View> UdfpsView.addUdfpsView(
- @LayoutRes id: Int,
- init: T.() -> Unit = {}
- ): T {
- val subView = inflater.inflate(id, null) as T
- addView(subView)
- subView.init()
- return subView
- }
}
@RequestReason
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsFpmEmptyView.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsFpmEmptyView.kt
deleted file mode 100644
index 0838855f4756..000000000000
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsFpmEmptyView.kt
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2021 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 com.android.systemui.biometrics
-
-import android.content.Context
-import android.graphics.Rect
-import android.util.AttributeSet
-import android.view.View
-import android.view.ViewGroup
-import com.android.systemui.res.R
-
-/**
- * View corresponding with udfps_fpm_empty_view.xml
- *
- * Currently doesn't draw anything.
- */
-class UdfpsFpmEmptyView(
- context: Context,
- attrs: AttributeSet?
-) : UdfpsAnimationView(context, attrs) {
-
- // Drawable isn't ever added to the view, so we don't currently show anything
- private val fingerprintDrawable: UdfpsFpDrawable = UdfpsFpDrawable(context)
-
- override fun getDrawable(): UdfpsDrawable = fingerprintDrawable
-
- fun updateAccessibilityViewLocation(sensorBounds: Rect) {
- val fingerprintAccessibilityView: View =
- requireViewById(R.id.udfps_enroll_accessibility_view)
- val params: ViewGroup.LayoutParams = fingerprintAccessibilityView.layoutParams
- params.width = sensorBounds.width()
- params.height = sensorBounds.height()
- fingerprintAccessibilityView.layoutParams = params
- fingerprintAccessibilityView.requestLayout()
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsFpmEmptyViewController.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsFpmEmptyViewController.kt
deleted file mode 100644
index cfbbc26800d2..000000000000
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsFpmEmptyViewController.kt
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2021 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 com.android.systemui.biometrics
-
-import com.android.systemui.biometrics.domain.interactor.UdfpsOverlayInteractor
-import com.android.systemui.dump.DumpManager
-import com.android.systemui.plugins.statusbar.StatusBarStateController
-import com.android.systemui.shade.domain.interactor.ShadeInteractor
-import com.android.systemui.statusbar.phone.SystemUIDialogManager
-
-/**
- * Class that coordinates non-HBM animations for non keyguard, or biometric prompt states.
- *
- * Currently doesn't draw anything.
- */
-class UdfpsFpmEmptyViewController(
- view: UdfpsFpmEmptyView,
- statusBarStateController: StatusBarStateController,
- shadeInteractor: ShadeInteractor,
- systemUIDialogManager: SystemUIDialogManager,
- dumpManager: DumpManager,
- udfpsOverlayInteractor: UdfpsOverlayInteractor,
-) : UdfpsAnimationViewController<UdfpsFpmEmptyView>(
- view,
- statusBarStateController,
- shadeInteractor,
- systemUIDialogManager,
- dumpManager,
- udfpsOverlayInteractor,
-) {
- override val tag = "UdfpsFpmOtherViewController"
-}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerLegacy.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerLegacy.kt
deleted file mode 100644
index c3d9240c40a1..000000000000
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerLegacy.kt
+++ /dev/null
@@ -1,555 +0,0 @@
-/*
- * Copyright (C) 2021 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 com.android.systemui.biometrics
-
-import android.content.res.Configuration
-import android.util.MathUtils
-import android.view.View
-import androidx.annotation.VisibleForTesting
-import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.repeatOnLifecycle
-import com.android.app.animation.Interpolators
-import com.android.keyguard.BouncerPanelExpansionCalculator.aboutToShowBouncerProgress
-import com.android.keyguard.KeyguardUpdateMonitor
-import com.android.systemui.animation.ActivityTransitionAnimator
-import com.android.systemui.biometrics.UdfpsKeyguardViewLegacy.ANIMATE_APPEAR_ON_SCREEN_OFF
-import com.android.systemui.biometrics.domain.interactor.UdfpsOverlayInteractor
-import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor
-import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor
-import com.android.systemui.dump.DumpManager
-import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
-import com.android.systemui.keyguard.shared.model.Edge
-import com.android.systemui.keyguard.shared.model.KeyguardState.ALTERNATE_BOUNCER
-import com.android.systemui.keyguard.shared.model.KeyguardState.AOD
-import com.android.systemui.keyguard.shared.model.KeyguardState.DREAMING
-import com.android.systemui.keyguard.shared.model.KeyguardState.GONE
-import com.android.systemui.keyguard.shared.model.KeyguardState.OCCLUDED
-import com.android.systemui.keyguard.shared.model.KeyguardState.PRIMARY_BOUNCER
-import com.android.systemui.lifecycle.repeatWhenAttached
-import com.android.systemui.plugins.statusbar.StatusBarStateController
-import com.android.systemui.res.R
-import com.android.systemui.scene.shared.model.Scenes
-import com.android.systemui.shade.domain.interactor.ShadeInteractor
-import com.android.systemui.statusbar.LockscreenShadeTransitionController
-import com.android.systemui.statusbar.StatusBarState
-import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager
-import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager.KeyguardViewManagerCallback
-import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager.OccludingAppBiometricUI
-import com.android.systemui.statusbar.phone.SystemUIDialogManager
-import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController
-import com.android.systemui.statusbar.policy.ConfigurationController
-import com.android.systemui.statusbar.policy.KeyguardStateController
-import com.android.systemui.user.domain.interactor.SelectedUserInteractor
-import java.io.PrintWriter
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.Job
-import kotlinx.coroutines.launch
-
-/** Class that coordinates non-HBM animations during keyguard authentication. */
-@ExperimentalCoroutinesApi
-open class UdfpsKeyguardViewControllerLegacy(
- private val view: UdfpsKeyguardViewLegacy,
- statusBarStateController: StatusBarStateController,
- private val keyguardViewManager: StatusBarKeyguardViewManager,
- private val keyguardUpdateMonitor: KeyguardUpdateMonitor,
- dumpManager: DumpManager,
- private val lockScreenShadeTransitionController: LockscreenShadeTransitionController,
- private val configurationController: ConfigurationController,
- private val keyguardStateController: KeyguardStateController,
- private val unlockedScreenOffAnimationController: UnlockedScreenOffAnimationController,
- systemUIDialogManager: SystemUIDialogManager,
- private val udfpsController: UdfpsController,
- private val activityTransitionAnimator: ActivityTransitionAnimator,
- private val primaryBouncerInteractor: PrimaryBouncerInteractor,
- private val alternateBouncerInteractor: AlternateBouncerInteractor,
- private val udfpsKeyguardAccessibilityDelegate: UdfpsKeyguardAccessibilityDelegate,
- private val selectedUserInteractor: SelectedUserInteractor,
- private val transitionInteractor: KeyguardTransitionInteractor,
- shadeInteractor: ShadeInteractor,
- udfpsOverlayInteractor: UdfpsOverlayInteractor,
-) :
- UdfpsAnimationViewController<UdfpsKeyguardViewLegacy>(
- view,
- statusBarStateController,
- shadeInteractor,
- systemUIDialogManager,
- dumpManager,
- udfpsOverlayInteractor,
- ) {
- private val uniqueIdentifier = this.toString()
- private var showingUdfpsBouncer = false
- private var udfpsRequested = false
- private var qsExpansion = 0f
- private var faceDetectRunning = false
- private var statusBarState = 0
- private var transitionToFullShadeProgress = 0f
- private var lastDozeAmount = 0f
- private var panelExpansionFraction = 0f
- private var launchTransitionFadingAway = false
- private var isLaunchingActivity = false
- private var activityLaunchProgress = 0f
- private var inputBouncerExpansion = 0f
-
- private val stateListener: StatusBarStateController.StateListener =
- object : StatusBarStateController.StateListener {
- override fun onStateChanged(statusBarState: Int) {
- this@UdfpsKeyguardViewControllerLegacy.statusBarState = statusBarState
- updateAlpha()
- updatePauseAuth()
- }
- }
-
- private val configurationListener: ConfigurationController.ConfigurationListener =
- object : ConfigurationController.ConfigurationListener {
- override fun onUiModeChanged() {
- view.updateColor()
- }
-
- override fun onThemeChanged() {
- view.updateColor()
- }
-
- override fun onConfigChanged(newConfig: Configuration) {
- updateScaleFactor()
- view.updatePadding()
- view.updateColor()
- }
- }
-
- private val keyguardStateControllerCallback: KeyguardStateController.Callback =
- object : KeyguardStateController.Callback {
- override fun onUnlockedChanged() {
- updatePauseAuth()
- }
-
- override fun onLaunchTransitionFadingAwayChanged() {
- launchTransitionFadingAway = keyguardStateController.isLaunchTransitionFadingAway
- updatePauseAuth()
- }
- }
-
- private val mActivityTransitionAnimatorListener: ActivityTransitionAnimator.Listener =
- object : ActivityTransitionAnimator.Listener {
- override fun onTransitionAnimationStart() {
- isLaunchingActivity = true
- activityLaunchProgress = 0f
- updateAlpha()
- }
-
- override fun onTransitionAnimationEnd() {
- isLaunchingActivity = false
- updateAlpha()
- }
-
- override fun onTransitionAnimationProgress(linearProgress: Float) {
- activityLaunchProgress = linearProgress
- updateAlpha()
- }
- }
-
- private val statusBarKeyguardViewManagerCallback: KeyguardViewManagerCallback =
- object : KeyguardViewManagerCallback {
- override fun onQSExpansionChanged(qsExpansion: Float) {
- this@UdfpsKeyguardViewControllerLegacy.qsExpansion = qsExpansion
- updateAlpha()
- updatePauseAuth()
- }
- }
-
- private val occludingAppBiometricUI: OccludingAppBiometricUI =
- object : OccludingAppBiometricUI {
- override fun requestUdfps(request: Boolean, color: Int) {
- udfpsRequested = request
- view.requestUdfps(request, color)
- updateAlpha()
- updatePauseAuth()
- }
-
- override fun dump(pw: PrintWriter) {
- pw.println(tag)
- }
- }
-
- override val tag: String
- get() = TAG
-
- override fun onInit() {
- super.onInit()
- keyguardViewManager.setOccludingAppBiometricUI(occludingAppBiometricUI)
- }
-
- init {
- com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor.assertInLegacyMode()
- view.repeatWhenAttached {
- // repeatOnLifecycle CREATED (as opposed to STARTED) because the Bouncer expansion
- // can make the view not visible; and we still want to listen for events
- // that may make the view visible again.
- repeatOnLifecycle(Lifecycle.State.CREATED) {
- listenForBouncerExpansion(this)
- listenForAlternateBouncerVisibility(this)
- listenForOccludedToAodTransition(this)
- listenForGoneToAodTransition(this)
- listenForLockscreenAodTransitions(this)
- listenForAodToOccludedTransitions(this)
- listenForAlternateBouncerToAodTransitions(this)
- listenForDreamingToAodTransitions(this)
- listenForPrimaryBouncerToAodTransitions(this)
- }
- }
- }
-
- @VisibleForTesting
- suspend fun listenForPrimaryBouncerToAodTransitions(scope: CoroutineScope): Job {
- return scope.launch {
- transitionInteractor
- .transition(
- edge = Edge.create(Scenes.Bouncer, AOD),
- edgeWithoutSceneContainer = Edge.create(PRIMARY_BOUNCER, AOD)
- )
- .collect { transitionStep ->
- view.onDozeAmountChanged(
- transitionStep.value,
- transitionStep.value,
- ANIMATE_APPEAR_ON_SCREEN_OFF,
- )
- }
- }
- }
-
- @VisibleForTesting
- suspend fun listenForDreamingToAodTransitions(scope: CoroutineScope): Job {
- return scope.launch {
- transitionInteractor.transition(Edge.create(DREAMING, AOD)).collect { transitionStep ->
- view.onDozeAmountChanged(
- transitionStep.value,
- transitionStep.value,
- ANIMATE_APPEAR_ON_SCREEN_OFF,
- )
- }
- }
- }
-
- @VisibleForTesting
- suspend fun listenForAlternateBouncerToAodTransitions(scope: CoroutineScope): Job {
- return scope.launch {
- transitionInteractor.transition(Edge.create(ALTERNATE_BOUNCER, AOD)).collect {
- transitionStep ->
- view.onDozeAmountChanged(
- transitionStep.value,
- transitionStep.value,
- UdfpsKeyguardViewLegacy.ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN,
- )
- }
- }
- }
-
- @VisibleForTesting
- suspend fun listenForAodToOccludedTransitions(scope: CoroutineScope): Job {
- return scope.launch {
- transitionInteractor.transition(Edge.create(AOD, OCCLUDED)).collect { transitionStep ->
- view.onDozeAmountChanged(
- 1f - transitionStep.value,
- 1f - transitionStep.value,
- UdfpsKeyguardViewLegacy.ANIMATION_NONE,
- )
- }
- }
- }
-
- @VisibleForTesting
- suspend fun listenForOccludedToAodTransition(scope: CoroutineScope): Job {
- return scope.launch {
- transitionInteractor.transition(Edge.create(OCCLUDED, AOD)).collect { transitionStep ->
- view.onDozeAmountChanged(
- transitionStep.value,
- transitionStep.value,
- ANIMATE_APPEAR_ON_SCREEN_OFF,
- )
- }
- }
- }
-
- @VisibleForTesting
- suspend fun listenForGoneToAodTransition(scope: CoroutineScope): Job {
- return scope.launch {
- transitionInteractor
- .transition(
- edge = Edge.create(Scenes.Gone, AOD),
- edgeWithoutSceneContainer = Edge.create(GONE, AOD)
- )
- .collect { transitionStep ->
- view.onDozeAmountChanged(
- transitionStep.value,
- transitionStep.value,
- ANIMATE_APPEAR_ON_SCREEN_OFF,
- )
- }
- }
- }
-
- @VisibleForTesting
- suspend fun listenForLockscreenAodTransitions(scope: CoroutineScope): Job {
- return scope.launch {
- transitionInteractor.transitionValue(AOD).collect {
- view.onDozeAmountChanged(
- it,
- it,
- UdfpsKeyguardViewLegacy.ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN,
- )
- }
- }
- }
-
- @VisibleForTesting
- suspend fun listenForBouncerExpansion(scope: CoroutineScope): Job {
- return scope.launch {
- primaryBouncerInteractor.bouncerExpansion.collect { bouncerExpansion: Float ->
- inputBouncerExpansion = bouncerExpansion
-
- panelExpansionFraction =
- if (keyguardViewManager.isPrimaryBouncerInTransit) {
- aboutToShowBouncerProgress(1f - bouncerExpansion)
- } else {
- 1f - bouncerExpansion
- }
- updateAlpha()
- updatePauseAuth()
- }
- }
- }
-
- @VisibleForTesting
- suspend fun listenForAlternateBouncerVisibility(scope: CoroutineScope): Job {
- return scope.launch {
- alternateBouncerInteractor.isVisible.collect { isVisible: Boolean ->
- showUdfpsBouncer(isVisible)
- }
- }
- }
-
- public override fun onViewAttached() {
- super.onViewAttached()
- alternateBouncerInteractor.setAlternateBouncerUIAvailable(true, uniqueIdentifier)
- val dozeAmount = statusBarStateController.dozeAmount
- lastDozeAmount = dozeAmount
- stateListener.onDozeAmountChanged(dozeAmount, dozeAmount)
- statusBarStateController.addCallback(stateListener)
- udfpsRequested = false
- launchTransitionFadingAway = keyguardStateController.isLaunchTransitionFadingAway
- keyguardStateController.addCallback(keyguardStateControllerCallback)
- statusBarState = statusBarStateController.state
- qsExpansion = keyguardViewManager.qsExpansion
- keyguardViewManager.addCallback(statusBarKeyguardViewManagerCallback)
- configurationController.addCallback(configurationListener)
- updateScaleFactor()
- view.updatePadding()
- updateAlpha()
- updatePauseAuth()
- keyguardViewManager.setOccludingAppBiometricUI(occludingAppBiometricUI)
- lockScreenShadeTransitionController.mUdfpsKeyguardViewControllerLegacy = this
- activityTransitionAnimator.addListener(mActivityTransitionAnimatorListener)
- view.startIconAsyncInflate {
- val animationViewInternal: View =
- view.requireViewById(R.id.udfps_animation_view_internal)
- animationViewInternal.accessibilityDelegate = udfpsKeyguardAccessibilityDelegate
- }
- }
-
- public override fun onViewDetached() {
- super.onViewDetached()
- alternateBouncerInteractor.setAlternateBouncerUIAvailable(false, uniqueIdentifier)
- faceDetectRunning = false
- keyguardStateController.removeCallback(keyguardStateControllerCallback)
- statusBarStateController.removeCallback(stateListener)
- keyguardViewManager.removeOccludingAppBiometricUI(occludingAppBiometricUI)
- configurationController.removeCallback(configurationListener)
- if (lockScreenShadeTransitionController.mUdfpsKeyguardViewControllerLegacy === this) {
- lockScreenShadeTransitionController.mUdfpsKeyguardViewControllerLegacy = null
- }
- activityTransitionAnimator.removeListener(mActivityTransitionAnimatorListener)
- keyguardViewManager.removeCallback(statusBarKeyguardViewManagerCallback)
- }
-
- override fun dump(pw: PrintWriter, args: Array<String>) {
- super.dump(pw, args)
- pw.println("showingUdfpsAltBouncer=$showingUdfpsBouncer")
- pw.println(
- "altBouncerInteractor#isAlternateBouncerVisible=" +
- "${alternateBouncerInteractor.isVisibleState()}"
- )
- pw.println(
- "altBouncerInteractor#canShowAlternateBouncerForFingerprint=" +
- "${alternateBouncerInteractor.canShowAlternateBouncerForFingerprint()}"
- )
- pw.println("faceDetectRunning=$faceDetectRunning")
- pw.println("statusBarState=" + StatusBarState.toString(statusBarState))
- pw.println("transitionToFullShadeProgress=$transitionToFullShadeProgress")
- pw.println("qsExpansion=$qsExpansion")
- pw.println("panelExpansionFraction=$panelExpansionFraction")
- pw.println("unpausedAlpha=" + view.unpausedAlpha)
- pw.println("udfpsRequestedByApp=$udfpsRequested")
- pw.println("launchTransitionFadingAway=$launchTransitionFadingAway")
- pw.println("lastDozeAmount=$lastDozeAmount")
- pw.println("inputBouncerExpansion=$inputBouncerExpansion")
- view.dump(pw)
- }
-
- /**
- * Overrides non-bouncer show logic in shouldPauseAuth to still show icon.
- *
- * @return whether the udfpsBouncer has been newly shown or hidden
- */
- private fun showUdfpsBouncer(show: Boolean): Boolean {
- if (showingUdfpsBouncer == show) {
- return false
- }
- val udfpsAffordanceWasNotShowing = shouldPauseAuth()
- showingUdfpsBouncer = show
- if (showingUdfpsBouncer) {
- if (udfpsAffordanceWasNotShowing) {
- view.animateInUdfpsBouncer(null)
- }
- view.announceForAccessibility(
- view.context.getString(R.string.accessibility_fingerprint_bouncer)
- )
- }
- updateAlpha()
- updatePauseAuth()
- return true
- }
-
- /**
- * Returns true if the fingerprint manager is running but we want to temporarily pause
- * authentication. On the keyguard, we may want to show udfps when the shade is expanded, so
- * this can be overridden with the showBouncer method.
- */
- override fun shouldPauseAuth(): Boolean {
- if (showingUdfpsBouncer) {
- return false
- }
- if (
- udfpsRequested &&
- !notificationShadeVisible &&
- !isInputBouncerFullyVisible() &&
- keyguardStateController.isShowing
- ) {
- return false
- }
- if (launchTransitionFadingAway) {
- return true
- }
-
- // Only pause auth if we're not on the keyguard AND we're not transitioning to doze.
- // For the UnlockedScreenOffAnimation, the statusBarState is
- // delayed. However, we still animate in the UDFPS affordance with the
- // unlockedScreenOffDozeAnimator.
- if (
- statusBarState != StatusBarState.KEYGUARD &&
- !unlockedScreenOffAnimationController.isAnimationPlaying()
- ) {
- return true
- }
- if (isBouncerExpansionGreaterThan(.5f)) {
- return true
- }
- if (
- keyguardUpdateMonitor.getUserUnlockedWithBiometric(
- selectedUserInteractor.getSelectedUserId()
- )
- ) {
- // If the device was unlocked by a biometric, immediately hide the UDFPS icon to avoid
- // overlap with the LockIconView. Shortly afterwards, UDFPS will stop running.
- return true
- }
- return view.unpausedAlpha < 255 * .1
- }
-
- fun isBouncerExpansionGreaterThan(bouncerExpansionThreshold: Float): Boolean {
- return inputBouncerExpansion >= bouncerExpansionThreshold
- }
-
- fun isInputBouncerFullyVisible(): Boolean {
- return inputBouncerExpansion == 1f
- }
-
- override fun listenForTouchesOutsideView(): Boolean {
- return true
- }
-
- /**
- * Set the progress we're currently transitioning to the full shade. 0.0f means we're not
- * transitioning yet, while 1.0f means we've fully dragged down. For example, start swiping down
- * to expand the notification shade from the empty space in the middle of the lock screen.
- */
- fun setTransitionToFullShadeProgress(progress: Float) {
- transitionToFullShadeProgress = progress
- updateAlpha()
- }
-
- /**
- * Update alpha for the UDFPS lock screen affordance. The AoD UDFPS visual affordance's alpha is
- * based on the doze amount.
- */
- override fun updateAlpha() {
- // Fade icon on transitions to showing the status bar or bouncer, but if mUdfpsRequested,
- // then the keyguard is occluded by some application - so instead use the input bouncer
- // hidden amount to determine the fade.
- val expansion = if (udfpsRequested) getInputBouncerHiddenAmt() else panelExpansionFraction
- var alpha: Int =
- if (showingUdfpsBouncer) 255
- else MathUtils.constrain(MathUtils.map(.5f, .9f, 0f, 255f, expansion), 0f, 255f).toInt()
- if (!showingUdfpsBouncer) {
- // swipe from top of the lockscreen to expand full QS:
- alpha =
- (alpha * (1.0f - Interpolators.EMPHASIZED_DECELERATE.getInterpolation(qsExpansion)))
- .toInt()
-
- // swipe from the middle (empty space) of lockscreen to expand the notification shade:
- alpha = (alpha * (1.0f - transitionToFullShadeProgress)).toInt()
-
- // Fade out the icon if we are animating an activity launch over the lockscreen and the
- // activity didn't request the UDFPS.
- if (isLaunchingActivity && !udfpsRequested) {
- val udfpsActivityLaunchAlphaMultiplier =
- 1f -
- (activityLaunchProgress *
- (ActivityTransitionAnimator.TIMINGS.totalDuration / 83))
- .coerceIn(0f, 1f)
- alpha = (alpha * udfpsActivityLaunchAlphaMultiplier).toInt()
- }
-
- // Fade out alpha when a dialog is shown
- // Fade in alpha when a dialog is hidden
- alpha = (alpha * view.dialogSuggestedAlpha).toInt()
- }
- view.unpausedAlpha = alpha
- }
-
- private fun getInputBouncerHiddenAmt(): Float {
- return 1f - inputBouncerExpansion
- }
-
- /** Update the scale factor based on the device's resolution. */
- private fun updateScaleFactor() {
- udfpsController.mOverlayParams?.scaleFactor?.let { view.setScaleFactor(it) }
- }
-
- companion object {
- const val TAG = "UdfpsKeyguardViewController"
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacy.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacy.java
deleted file mode 100644
index 6d4eea852d26..000000000000
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacy.java
+++ /dev/null
@@ -1,330 +0,0 @@
-/*
- * Copyright (C) 2021 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 com.android.systemui.biometrics;
-
-import static com.android.systemui.doze.util.BurnInHelperKt.getBurnInOffset;
-import static com.android.systemui.doze.util.BurnInHelperKt.getBurnInProgressOffset;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.AnimatorSet;
-import android.animation.ObjectAnimator;
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffColorFilter;
-import android.graphics.Rect;
-import android.graphics.RectF;
-import android.util.AttributeSet;
-import android.util.MathUtils;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-
-import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.asynclayoutinflater.view.AsyncLayoutInflater;
-
-import com.android.app.animation.Interpolators;
-import com.android.settingslib.Utils;
-import com.android.systemui.res.R;
-
-import com.airbnb.lottie.LottieAnimationView;
-import com.airbnb.lottie.LottieProperty;
-import com.airbnb.lottie.model.KeyPath;
-
-import java.io.PrintWriter;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * View corresponding with udfps_keyguard_view_legacy.xml
- */
-public class UdfpsKeyguardViewLegacy extends UdfpsAnimationView {
- private UdfpsDrawable mFingerprintDrawable; // placeholder
- private LottieAnimationView mAodFp;
- private LottieAnimationView mLockScreenFp;
-
- // used when highlighting fp icon:
- private int mTextColorPrimary;
- private ImageView mBgProtection;
- boolean mUdfpsRequested;
-
- private AnimatorSet mBackgroundInAnimator = new AnimatorSet();
- private int mAlpha; // 0-255
- private float mScaleFactor = 1;
- private Rect mSensorBounds = new Rect();
-
- // AOD anti-burn-in offsets
- private final int mMaxBurnInOffsetX;
- private final int mMaxBurnInOffsetY;
- private float mInterpolatedDarkAmount;
- private int mAnimationType = ANIMATION_NONE;
- private boolean mFullyInflated;
- private Runnable mOnFinishInflateRunnable;
-
- public UdfpsKeyguardViewLegacy(Context context, @Nullable AttributeSet attrs) {
- super(context, attrs);
- mFingerprintDrawable = new UdfpsFpDrawable(context);
-
- mMaxBurnInOffsetX = context.getResources()
- .getDimensionPixelSize(R.dimen.udfps_burn_in_offset_x);
- mMaxBurnInOffsetY = context.getResources()
- .getDimensionPixelSize(R.dimen.udfps_burn_in_offset_y);
- }
-
- /**
- * Inflate internal udfps view on a background thread and call the onFinishRunnable
- * when inflation is finished.
- */
- public void startIconAsyncInflate(Runnable onFinishInflate) {
- mOnFinishInflateRunnable = onFinishInflate;
- // inflate Lottie views on a background thread in case it takes a while to inflate
- AsyncLayoutInflater inflater = new AsyncLayoutInflater(mContext);
- inflater.inflate(R.layout.udfps_keyguard_view_internal, this,
- mLayoutInflaterFinishListener);
- }
-
- @Override
- public UdfpsDrawable getDrawable() {
- return mFingerprintDrawable;
- }
-
- @Override
- void onSensorRectUpdated(RectF bounds) {
- super.onSensorRectUpdated(bounds);
- bounds.round(this.mSensorBounds);
- postInvalidate();
- }
-
- @Override
- void onDisplayConfiguring() {
- }
-
- @Override
- void onDisplayUnconfigured() {
- }
-
- @Override
- public boolean dozeTimeTick() {
- updateBurnInOffsets();
- return true;
- }
-
- private void updateBurnInOffsets() {
- if (!mFullyInflated) {
- return;
- }
-
- // if we're animating from screen off, we can immediately place the icon in the
- // AoD-burn in location, else we need to translate the icon from LS => AoD.
- final float darkAmountForAnimation = mAnimationType == ANIMATE_APPEAR_ON_SCREEN_OFF
- ? 1f : mInterpolatedDarkAmount;
- final float burnInOffsetX = MathUtils.lerp(0f,
- getBurnInOffset(mMaxBurnInOffsetX * 2, true /* xAxis */)
- - mMaxBurnInOffsetX, darkAmountForAnimation);
- final float burnInOffsetY = MathUtils.lerp(0f,
- getBurnInOffset(mMaxBurnInOffsetY * 2, false /* xAxis */)
- - mMaxBurnInOffsetY, darkAmountForAnimation);
- final float burnInProgress = MathUtils.lerp(0f, getBurnInProgressOffset(),
- darkAmountForAnimation);
-
- if (mAnimationType == ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN && !mPauseAuth) {
- mLockScreenFp.setTranslationX(burnInOffsetX);
- mLockScreenFp.setTranslationY(burnInOffsetY);
- mBgProtection.setAlpha(1f - mInterpolatedDarkAmount);
- mLockScreenFp.setAlpha(1f - mInterpolatedDarkAmount);
- } else if (darkAmountForAnimation == 0f) {
- // we're on the lockscreen and should use mAlpha (changes based on shade expansion)
- mLockScreenFp.setTranslationX(0);
- mLockScreenFp.setTranslationY(0);
- mBgProtection.setAlpha(mAlpha / 255f);
- mLockScreenFp.setAlpha(mAlpha / 255f);
- } else {
- mBgProtection.setAlpha(0f);
- mLockScreenFp.setAlpha(0f);
- }
- mLockScreenFp.setProgress(1f - mInterpolatedDarkAmount);
-
- mAodFp.setTranslationX(burnInOffsetX);
- mAodFp.setTranslationY(burnInOffsetY);
- mAodFp.setProgress(burnInProgress);
- mAodFp.setAlpha(mInterpolatedDarkAmount);
-
- // done animating
- final boolean doneAnimatingBetweenAodAndLS =
- mAnimationType == ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN
- && (mInterpolatedDarkAmount == 0f || mInterpolatedDarkAmount == 1f);
- final boolean doneAnimatingUnlockedScreenOff =
- mAnimationType == ANIMATE_APPEAR_ON_SCREEN_OFF
- && (mInterpolatedDarkAmount == 1f);
- if (doneAnimatingBetweenAodAndLS || doneAnimatingUnlockedScreenOff) {
- mAnimationType = ANIMATION_NONE;
- }
- }
-
- void requestUdfps(boolean request, int color) {
- mUdfpsRequested = request;
- }
-
- void updateColor() {
- if (!mFullyInflated) {
- return;
- }
-
- mTextColorPrimary = Utils.getColorAttrDefaultColor(mContext,
- com.android.internal.R.attr.materialColorOnSurface);
- final int backgroundColor = Utils.getColorAttrDefaultColor(getContext(),
- com.android.internal.R.attr.materialColorSurfaceContainerHigh);
- mBgProtection.setImageTintList(ColorStateList.valueOf(backgroundColor));
- mLockScreenFp.invalidate(); // updated with a valueCallback
- }
-
- void setScaleFactor(float scale) {
- mScaleFactor = scale;
- }
-
- void updatePadding() {
- if (mLockScreenFp == null || mAodFp == null) {
- return;
- }
-
- final int defaultPaddingPx =
- getResources().getDimensionPixelSize(R.dimen.lock_icon_padding);
- final int padding = (int) (defaultPaddingPx * mScaleFactor);
- mLockScreenFp.setPadding(padding, padding, padding, padding);
- mAodFp.setPadding(padding, padding, padding, padding);
- }
-
- /**
- * @param alpha between 0 and 255
- */
- void setUnpausedAlpha(int alpha) {
- mAlpha = alpha;
- updateAlpha();
- }
-
- /**
- * @return alpha between 0 and 255
- */
- int getUnpausedAlpha() {
- return mAlpha;
- }
-
- @Override
- protected int updateAlpha() {
- int alpha = super.updateAlpha();
- updateBurnInOffsets();
- return alpha;
- }
-
- @Override
- int calculateAlpha() {
- if (mPauseAuth) {
- return 0;
- }
- return mAlpha;
- }
-
- static final int ANIMATION_NONE = 0;
- static final int ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN = 1;
- static final int ANIMATE_APPEAR_ON_SCREEN_OFF = 2;
-
- @Retention(RetentionPolicy.SOURCE)
- @IntDef({ANIMATION_NONE, ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN, ANIMATE_APPEAR_ON_SCREEN_OFF})
- private @interface AnimationType {}
-
- void onDozeAmountChanged(float linear, float eased, @AnimationType int animationType) {
- mAnimationType = animationType;
- mInterpolatedDarkAmount = eased;
- updateAlpha();
- }
-
- void updateSensorLocation(@NonNull Rect sensorBounds) {
- mSensorBounds.set(sensorBounds);
- }
-
- /**
- * Animates in the bg protection circle behind the fp icon to highlight the icon.
- */
- void animateInUdfpsBouncer(Runnable onEndAnimation) {
- if (mBackgroundInAnimator.isRunning() || !mFullyInflated) {
- // already animating in or not yet inflated
- return;
- }
-
- // fade in and scale up
- mBackgroundInAnimator = new AnimatorSet();
- mBackgroundInAnimator.playTogether(
- ObjectAnimator.ofFloat(mBgProtection, View.ALPHA, 0f, 1f),
- ObjectAnimator.ofFloat(mBgProtection, View.SCALE_X, 0f, 1f),
- ObjectAnimator.ofFloat(mBgProtection, View.SCALE_Y, 0f, 1f));
- mBackgroundInAnimator.setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
- mBackgroundInAnimator.setDuration(500);
- mBackgroundInAnimator.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- if (onEndAnimation != null) {
- onEndAnimation.run();
- }
- }
- });
- mBackgroundInAnimator.start();
- }
-
- /**
- * Print debugging information for this class.
- */
- public void dump(PrintWriter pw) {
- pw.println("UdfpsKeyguardView (" + this + ")");
- pw.println(" mPauseAuth=" + mPauseAuth);
- pw.println(" mUnpausedAlpha=" + getUnpausedAlpha());
- pw.println(" mUdfpsRequested=" + mUdfpsRequested);
- pw.println(" mInterpolatedDarkAmount=" + mInterpolatedDarkAmount);
- pw.println(" mAnimationType=" + mAnimationType);
- }
-
- private final AsyncLayoutInflater.OnInflateFinishedListener mLayoutInflaterFinishListener =
- new AsyncLayoutInflater.OnInflateFinishedListener() {
- @Override
- public void onInflateFinished(View view, int resid, ViewGroup parent) {
- mFullyInflated = true;
- mAodFp = view.findViewById(R.id.udfps_aod_fp);
- mLockScreenFp = view.findViewById(R.id.udfps_lockscreen_fp);
- mBgProtection = view.findViewById(R.id.udfps_keyguard_fp_bg);
-
- updatePadding();
- updateColor();
- updateAlpha();
-
- final LayoutParams lp = (LayoutParams) view.getLayoutParams();
- lp.width = mSensorBounds.width();
- lp.height = mSensorBounds.height();
- RectF relativeToView = getBoundsRelativeToView(new RectF(mSensorBounds));
- lp.setMarginsRelative((int) relativeToView.left, (int) relativeToView.top,
- (int) relativeToView.right, (int) relativeToView.bottom);
- parent.addView(view, lp);
-
- // requires call to invalidate to update the color
- mLockScreenFp.addValueCallback(new KeyPath("**"), LottieProperty.COLOR_FILTER,
- frameInfo -> new PorterDuffColorFilter(mTextColorPrimary,
- PorterDuff.Mode.SRC_ATOP));
- mOnFinishInflateRunnable.run();
- }
- };
-}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/UdfpsTouchOverlayBinder.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/UdfpsTouchOverlayBinder.kt
index 7503a8b4362d..a105d663424c 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/UdfpsTouchOverlayBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/UdfpsTouchOverlayBinder.kt
@@ -23,7 +23,6 @@ import androidx.lifecycle.repeatOnLifecycle
import com.android.systemui.biometrics.domain.interactor.UdfpsOverlayInteractor
import com.android.systemui.biometrics.ui.view.UdfpsTouchOverlay
import com.android.systemui.biometrics.ui.viewmodel.UdfpsTouchOverlayViewModel
-import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor
import com.android.systemui.lifecycle.repeatWhenAttached
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.launch
@@ -42,14 +41,13 @@ object UdfpsTouchOverlayBinder {
viewModel: UdfpsTouchOverlayViewModel,
udfpsOverlayInteractor: UdfpsOverlayInteractor,
) {
- if (DeviceEntryUdfpsRefactor.isUnexpectedlyInLegacyMode()) return
view.repeatWhenAttached {
repeatOnLifecycle(Lifecycle.State.CREATED) {
launch {
viewModel.shouldHandleTouches.collect { shouldHandleTouches ->
Log.d(
"UdfpsTouchOverlayBinder",
- "[$view]: update shouldHandleTouches=$shouldHandleTouches"
+ "[$view]: update shouldHandleTouches=$shouldHandleTouches",
)
view.isInvisible = !shouldHandleTouches
udfpsOverlayInteractor.setHandleTouches(shouldHandleTouches)
@@ -58,7 +56,7 @@ object UdfpsTouchOverlayBinder {
.invokeOnCompletion {
Log.d(
"UdfpsTouchOverlayBinder",
- "[$view-detached]: update shouldHandleTouches=false"
+ "[$view-detached]: update shouldHandleTouches=false",
)
udfpsOverlayInteractor.setHandleTouches(false)
}
diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/AuthMethodBouncerViewModel.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/AuthMethodBouncerViewModel.kt
index 4185aed3095c..148b9ea61e2c 100644
--- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/AuthMethodBouncerViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/AuthMethodBouncerViewModel.kt
@@ -17,7 +17,6 @@
package com.android.systemui.bouncer.ui.viewmodel
import android.annotation.StringRes
-import com.android.app.tracing.coroutines.flow.collectLatest
import com.android.systemui.authentication.domain.interactor.AuthenticationResult
import com.android.systemui.authentication.shared.model.AuthenticationMethodModel
import com.android.systemui.bouncer.domain.interactor.BouncerInteractor
@@ -28,6 +27,7 @@ import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
+import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.receiveAsFlow
sealed class AuthMethodBouncerViewModel(
diff --git a/packages/SystemUI/src/com/android/systemui/common/usagestats/data/repository/UsageStatsRepository.kt b/packages/SystemUI/src/com/android/systemui/common/usagestats/data/repository/UsageStatsRepository.kt
index e3f1174d4a5f..a695163ed155 100644
--- a/packages/SystemUI/src/com/android/systemui/common/usagestats/data/repository/UsageStatsRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/common/usagestats/data/repository/UsageStatsRepository.kt
@@ -19,7 +19,7 @@ package com.android.systemui.common.usagestats.data.repository
import android.app.usage.UsageEvents
import android.app.usage.UsageEventsQuery
import android.app.usage.UsageStatsManager
-import com.android.app.tracing.coroutines.withContext
+import com.android.app.tracing.coroutines.withContextTraced as withContext
import com.android.systemui.common.usagestats.data.model.UsageStatsQuery
import com.android.systemui.common.usagestats.shared.model.ActivityEventModel
import com.android.systemui.common.usagestats.shared.model.ActivityEventModel.Lifecycle
diff --git a/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalInteractor.kt b/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalInteractor.kt
index 3a04d026ee84..dc248059b3d4 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalInteractor.kt
@@ -23,7 +23,7 @@ import android.content.pm.UserInfo
import android.os.UserHandle
import android.os.UserManager
import android.provider.Settings
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.compose.animation.scene.ObservableTransitionState
import com.android.compose.animation.scene.SceneKey
import com.android.compose.animation.scene.TransitionKey
diff --git a/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalSceneInteractor.kt b/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalSceneInteractor.kt
index 3826fb40ea3d..428b83ddbb3a 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalSceneInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalSceneInteractor.kt
@@ -16,7 +16,7 @@
package com.android.systemui.communal.domain.interactor
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.compose.animation.scene.ObservableTransitionState
import com.android.compose.animation.scene.SceneKey
import com.android.compose.animation.scene.TransitionKey
diff --git a/packages/SystemUI/src/com/android/systemui/communal/ui/binder/CommunalAppWidgetHostViewBinder.kt b/packages/SystemUI/src/com/android/systemui/communal/ui/binder/CommunalAppWidgetHostViewBinder.kt
index ba96f4e56421..71bfe0c057e4 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/ui/binder/CommunalAppWidgetHostViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/ui/binder/CommunalAppWidgetHostViewBinder.kt
@@ -24,8 +24,7 @@ import android.view.ViewGroup
import android.widget.FrameLayout
import androidx.compose.ui.unit.IntSize
import androidx.core.view.doOnLayout
-import com.android.app.tracing.coroutines.flow.flowOn
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.systemui.Flags.communalWidgetResizing
import com.android.systemui.common.ui.view.onLayoutChanged
import com.android.systemui.communal.domain.model.CommunalContentModel
@@ -41,6 +40,7 @@ import kotlinx.coroutines.DisposableHandle
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.flowOn
object CommunalAppWidgetHostViewBinder {
private const val TAG = "CommunalAppWidgetHostViewBinder"
diff --git a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/ResizeableItemFrameViewModel.kt b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/ResizeableItemFrameViewModel.kt
index 87fcdd7b97ee..a519649a8f1c 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/ResizeableItemFrameViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/ResizeableItemFrameViewModel.kt
@@ -19,7 +19,7 @@ package com.android.systemui.communal.ui.viewmodel
import androidx.compose.foundation.gestures.AnchoredDraggableState
import androidx.compose.foundation.gestures.DraggableAnchors
import androidx.compose.runtime.snapshotFlow
-import com.android.app.tracing.coroutines.coroutineScope
+import com.android.app.tracing.coroutines.coroutineScopeTraced as coroutineScope
import com.android.systemui.lifecycle.ExclusiveActivatable
import kotlinx.coroutines.awaitCancellation
import kotlinx.coroutines.flow.Flow
diff --git a/packages/SystemUI/src/com/android/systemui/communal/util/WidgetViewFactory.kt b/packages/SystemUI/src/com/android/systemui/communal/util/WidgetViewFactory.kt
index 07a7c7cba2fd..d5d3a927181b 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/util/WidgetViewFactory.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/util/WidgetViewFactory.kt
@@ -19,7 +19,7 @@ package com.android.systemui.communal.util
import android.content.Context
import android.os.Bundle
import android.util.SizeF
-import com.android.app.tracing.coroutines.withContext
+import com.android.app.tracing.coroutines.withContextTraced as withContext
import com.android.systemui.communal.domain.model.CommunalContentModel
import com.android.systemui.communal.widgets.AppWidgetHostListenerDelegate
import com.android.systemui.communal.widgets.CommunalAppWidgetHost
diff --git a/packages/SystemUI/src/com/android/systemui/communal/widgets/WidgetInteractionHandler.kt b/packages/SystemUI/src/com/android/systemui/communal/widgets/WidgetInteractionHandler.kt
index 542b98896986..c894267a61dd 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/widgets/WidgetInteractionHandler.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/widgets/WidgetInteractionHandler.kt
@@ -21,7 +21,7 @@ import android.app.PendingIntent
import android.content.Intent
import android.view.View
import android.widget.RemoteViews
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.systemui.Flags.communalWidgetTrampolineFix
import com.android.systemui.animation.ActivityTransitionAnimator
diff --git a/packages/SystemUI/src/com/android/systemui/coroutines/Tracing.kt b/packages/SystemUI/src/com/android/systemui/coroutines/Tracing.kt
new file mode 100644
index 000000000000..5b1c9c8b8020
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/coroutines/Tracing.kt
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 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 com.android.systemui.coroutines
+
+import com.android.app.tracing.coroutines.createCoroutineTracingContext
+import kotlin.coroutines.CoroutineContext
+
+fun newTracingContext(name: String): CoroutineContext {
+ return createCoroutineTracingContext(name) { className ->
+ className.startsWith("com.android.systemui.util.kotlin.JavaAdapter") ||
+ className.startsWith("com.android.systemui.lifecycle.RepeatWhenAttached")
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/display/data/repository/DisplayScopeRepository.kt b/packages/SystemUI/src/com/android/systemui/display/data/repository/DisplayScopeRepository.kt
index 30624757ebe3..e3fce0007f26 100644
--- a/packages/SystemUI/src/com/android/systemui/display/data/repository/DisplayScopeRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/display/data/repository/DisplayScopeRepository.kt
@@ -17,8 +17,8 @@
package com.android.systemui.display.data.repository
import android.view.Display
-import com.android.app.tracing.coroutines.createCoroutineTracingContext
import com.android.systemui.CoreStartable
+import com.android.systemui.coroutines.newTracingContext
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.statusbar.core.StatusBarConnectedDisplays
@@ -69,7 +69,7 @@ constructor(
backgroundApplicationScope
} else {
CoroutineScope(
- backgroundDispatcher + createCoroutineTracingContext("DisplayScope$displayId")
+ backgroundDispatcher + newTracingContext("DisplayScope$displayId")
)
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/homecontrols/HomeControlsDreamService.kt b/packages/SystemUI/src/com/android/systemui/dreams/homecontrols/HomeControlsDreamService.kt
index 3992c3fb70b0..724f1c5323cf 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/homecontrols/HomeControlsDreamService.kt
+++ b/packages/SystemUI/src/com/android/systemui/dreams/homecontrols/HomeControlsDreamService.kt
@@ -22,6 +22,7 @@ import android.service.controls.ControlsProviderService
import android.service.dreams.DreamService
import android.window.TaskFragmentInfo
import com.android.systemui.controls.settings.ControlsSettingsRepository
+import com.android.systemui.coroutines.newTracingContext
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dreams.DreamLogger
import com.android.systemui.dreams.homecontrols.domain.interactor.HomeControlsComponentInteractor
@@ -39,7 +40,6 @@ import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.cancel
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
-import com.android.app.tracing.coroutines.createCoroutineTracingContext
class HomeControlsDreamService
@Inject
@@ -54,7 +54,8 @@ constructor(
) : DreamService() {
private val serviceJob = SupervisorJob()
- private val serviceScope = CoroutineScope(bgDispatcher + serviceJob + createCoroutineTracingContext("HomeControlsDreamService"))
+ private val serviceScope =
+ CoroutineScope(bgDispatcher + serviceJob + newTracingContext("HomeControlsDreamService"))
private val logger = DreamLogger(logBuffer, TAG)
private lateinit var taskFragmentComponent: TaskFragmentComponent
private val wakeLock: WakeLock by lazy {
diff --git a/packages/SystemUI/src/com/android/systemui/education/dagger/ContextualEducationModule.kt b/packages/SystemUI/src/com/android/systemui/education/dagger/ContextualEducationModule.kt
index 4caf95b707b1..7fa7da192ad0 100644
--- a/packages/SystemUI/src/com/android/systemui/education/dagger/ContextualEducationModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/education/dagger/ContextualEducationModule.kt
@@ -16,10 +16,10 @@
package com.android.systemui.education.dagger
-import com.android.app.tracing.coroutines.createCoroutineTracingContext
import com.android.systemui.CoreStartable
import com.android.systemui.Flags
import com.android.systemui.contextualeducation.GestureType
+import com.android.systemui.coroutines.newTracingContext
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.education.data.repository.ContextualEducationRepository
import com.android.systemui.education.data.repository.UserContextualEducationRepository
@@ -57,7 +57,9 @@ interface ContextualEducationModule {
fun provideEduDataStoreScope(
@Background bgDispatcher: CoroutineDispatcher
): CoroutineScope {
- return CoroutineScope(bgDispatcher + SupervisorJob() + createCoroutineTracingContext("EduDataStoreScope"))
+ return CoroutineScope(
+ bgDispatcher + SupervisorJob() + newTracingContext("EduDataStoreScope")
+ )
}
@EduClock
diff --git a/packages/SystemUI/src/com/android/systemui/haptics/slider/compose/ui/SliderHapticsViewModel.kt b/packages/SystemUI/src/com/android/systemui/haptics/slider/compose/ui/SliderHapticsViewModel.kt
index e396767ecf8e..1dbcb3dfe399 100644
--- a/packages/SystemUI/src/com/android/systemui/haptics/slider/compose/ui/SliderHapticsViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/haptics/slider/compose/ui/SliderHapticsViewModel.kt
@@ -22,7 +22,7 @@ import androidx.compose.foundation.interaction.InteractionSource
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.input.pointer.util.VelocityTracker
import androidx.compose.ui.unit.Velocity
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.systemui.haptics.slider.SeekableSliderTrackerConfig
import com.android.systemui.haptics.slider.SliderDragVelocityProvider
import com.android.systemui.haptics.slider.SliderEventType
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/CustomizationProvider.kt b/packages/SystemUI/src/com/android/systemui/keyguard/CustomizationProvider.kt
index 6df8355550a0..a94df091230d 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/CustomizationProvider.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/CustomizationProvider.kt
@@ -30,7 +30,7 @@ import android.net.Uri
import android.os.Binder
import android.os.Bundle
import android.util.Log
-import com.android.app.tracing.coroutines.runBlocking
+import com.android.app.tracing.coroutines.runBlockingTraced as runBlocking
import com.android.systemui.SystemUIAppComponentFactoryBase
import com.android.systemui.SystemUIAppComponentFactoryBase.ContextAvailableCallback
import com.android.systemui.dagger.qualifiers.Main
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepository.kt
index 690ae71aa56e..b7d0d453779f 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepository.kt
@@ -24,7 +24,7 @@ import android.annotation.SuppressLint
import android.os.Trace
import android.util.Log
import com.android.app.animation.Interpolators
-import com.android.app.tracing.coroutines.withContext
+import com.android.app.tracing.coroutines.withContextTraced as withContext
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.keyguard.shared.model.KeyguardState
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt
index 4cf9ec8890d4..9896365abff9 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt
@@ -19,7 +19,7 @@ package com.android.systemui.keyguard.domain.interactor
import android.animation.ValueAnimator
import android.util.Log
import com.android.app.animation.Interpolators
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt
index 9a0a85823929..7b757657b1d9 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt
@@ -20,7 +20,7 @@ import android.animation.ValueAnimator
import android.annotation.SuppressLint
import android.app.DreamManager
import com.android.app.animation.Interpolators
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.systemui.Flags.communalSceneKtfRefactor
import com.android.systemui.communal.domain.interactor.CommunalInteractor
import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractor.kt
index 6b6a3dce630a..a6f0db5a86aa 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractor.kt
@@ -18,7 +18,7 @@ package com.android.systemui.keyguard.domain.interactor
import android.animation.ValueAnimator
import com.android.app.animation.Interpolators
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.systemui.Flags.communalSceneKtfRefactor
import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor
import com.android.systemui.communal.domain.interactor.CommunalSettingsInteractor
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt
index 58c8a0456241..606a7a988970 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt
@@ -18,7 +18,7 @@ package com.android.systemui.keyguard.domain.interactor
import android.animation.ValueAnimator
import com.android.app.animation.Interpolators
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt
index 6d1d9cbd9aae..4d3727657f3e 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt
@@ -19,7 +19,7 @@ package com.android.systemui.keyguard.domain.interactor
import android.animation.ValueAnimator
import android.util.MathUtils
import com.android.app.animation.Interpolators
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.systemui.Flags.communalSceneKtfRefactor
import com.android.systemui.communal.domain.interactor.CommunalSettingsInteractor
import com.android.systemui.dagger.SysUISingleton
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractor.kt
index 2c3b481b9e16..26bf26b34a8a 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractor.kt
@@ -22,7 +22,7 @@ import android.app.admin.DevicePolicyManager
import android.content.Context
import android.content.Intent
import android.util.Log
-import com.android.app.tracing.coroutines.withContext
+import com.android.app.tracing.coroutines.withContextTraced as withContext
import com.android.compose.animation.scene.ObservableTransitionState
import com.android.internal.widget.LockPatternUtils
import com.android.keyguard.logging.KeyguardQuickAffordancesLogger
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerMessageAreaViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerMessageAreaViewBinder.kt
index fe5f632c0b6a..23b7b664d4f1 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerMessageAreaViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerMessageAreaViewBinder.kt
@@ -18,7 +18,7 @@ package com.android.systemui.keyguard.ui.binder
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.keyguard.AuthKeyguardMessageArea
import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerMessageAreaViewModel
import com.android.systemui.lifecycle.repeatWhenAttached
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerUdfpsViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerUdfpsViewBinder.kt
index 7ca2c2004452..6ef9863f1112 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerUdfpsViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerUdfpsViewBinder.kt
@@ -21,7 +21,7 @@ import android.content.res.ColorStateList
import android.view.View
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.systemui.keyguard.ui.view.DeviceEntryIconView
import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerUdfpsIconViewModel
import com.android.systemui.lifecycle.repeatWhenAttached
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinder.kt
index 1891af2d04b0..7a368999ecc9 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinder.kt
@@ -29,7 +29,7 @@ import androidx.constraintlayout.widget.ConstraintLayout
import androidx.constraintlayout.widget.ConstraintSet
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.systemui.CoreStartable
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/DeviceEntryIconViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/DeviceEntryIconViewBinder.kt
index a3f3342b9a6c..6c104a0a2470 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/DeviceEntryIconViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/DeviceEntryIconViewBinder.kt
@@ -28,7 +28,7 @@ import androidx.compose.ui.graphics.toArgb
import androidx.core.view.isInvisible
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.systemui.common.ui.view.LongPressHandlingView
import com.android.systemui.keyguard.ui.view.DeviceEntryIconView
import com.android.systemui.keyguard.ui.viewmodel.DeviceEntryBackgroundViewModel
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBlueprintViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBlueprintViewBinder.kt
index 0470e086ad27..5bad0168fe05 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBlueprintViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBlueprintViewBinder.kt
@@ -22,7 +22,7 @@ import androidx.constraintlayout.widget.ConstraintLayout
import androidx.constraintlayout.widget.ConstraintSet
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.systemui.customization.R as customR
import com.android.systemui.keyguard.KeyguardBottomAreaRefactor
import com.android.systemui.keyguard.shared.model.KeyguardBlueprint
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt
index 660a650fb916..3bdf7dac75b3 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt
@@ -36,7 +36,7 @@ import androidx.core.view.updateLayoutParams
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
import com.android.app.animation.Interpolators
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.settingslib.Utils
import com.android.systemui.animation.ActivityTransitionAnimator
import com.android.systemui.animation.Expandable
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardIndicationAreaBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardIndicationAreaBinder.kt
index ba94f45528c7..8b947a3bcb1e 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardIndicationAreaBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardIndicationAreaBinder.kt
@@ -22,7 +22,7 @@ import android.view.ViewGroup
import android.widget.TextView
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.systemui.keyguard.KeyguardBottomAreaRefactor
import com.android.systemui.keyguard.MigrateClocksToBlueprint
import com.android.systemui.keyguard.ui.viewmodel.KeyguardIndicationAreaViewModel
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardLongPressViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardLongPressViewBinder.kt
index 76d3389c25b4..2fd9818a38f0 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardLongPressViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardLongPressViewBinder.kt
@@ -22,7 +22,7 @@ import android.view.accessibility.AccessibilityNodeInfo
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.systemui.common.ui.view.LongPressHandlingView
import com.android.systemui.keyguard.ui.viewmodel.KeyguardTouchHandlingViewModel
import com.android.systemui.lifecycle.repeatWhenAttached
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardPreviewClockViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardPreviewClockViewBinder.kt
index 2d225562081a..210f4cdaaaf9 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardPreviewClockViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardPreviewClockViewBinder.kt
@@ -33,7 +33,7 @@ import androidx.constraintlayout.widget.ConstraintSet.TOP
import androidx.core.view.isVisible
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.internal.policy.SystemBarUtils
import com.android.systemui.customization.R as customR
import com.android.systemui.keyguard.shared.model.ClockSizeSetting
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardPreviewSmartspaceViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardPreviewSmartspaceViewBinder.kt
index 4b75b804e52b..baa681282a0b 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardPreviewSmartspaceViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardPreviewSmartspaceViewBinder.kt
@@ -22,7 +22,7 @@ import android.view.View
import androidx.core.view.isInvisible
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.systemui.keyguard.shared.model.ClockSizeSetting
import com.android.systemui.keyguard.ui.viewmodel.KeyguardPreviewSmartspaceViewModel
import com.android.systemui.lifecycle.repeatWhenAttached
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardQuickAffordanceViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardQuickAffordanceViewBinder.kt
index 27dd18d2b24e..cfd6481234ed 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardQuickAffordanceViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardQuickAffordanceViewBinder.kt
@@ -30,7 +30,7 @@ import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.keyguard.logging.KeyguardQuickAffordancesLogger
import com.android.settingslib.Utils
import com.android.systemui.animation.Expandable
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt
index ea70fd02eed5..89bca0c6a373 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt
@@ -39,7 +39,7 @@ import androidx.activity.setViewTreeOnBackPressedDispatcherOwner
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
import com.android.app.animation.Interpolators
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.internal.jank.InteractionJankMonitor
import com.android.internal.jank.InteractionJankMonitor.CUJ_SCREEN_OFF_SHOW_AOD
import com.android.keyguard.AuthInteractionProperties
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSettingsViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSettingsViewBinder.kt
index 4150ceb8aa31..79360370d937 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSettingsViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSettingsViewBinder.kt
@@ -22,7 +22,7 @@ import android.view.View
import androidx.core.view.isVisible
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.systemui.animation.ActivityTransitionAnimator
import com.android.systemui.common.ui.binder.IconViewBinder
import com.android.systemui.common.ui.binder.TextViewBinder
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSmartspaceViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSmartspaceViewBinder.kt
index 8b74f5dc791d..de4a1b03203c 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSmartspaceViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSmartspaceViewBinder.kt
@@ -21,7 +21,7 @@ import androidx.constraintlayout.helper.widget.Layer
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.systemui.keyguard.MigrateClocksToBlueprint
import com.android.systemui.keyguard.domain.interactor.KeyguardBlueprintInteractor
import com.android.systemui.keyguard.ui.view.layout.blueprints.transitions.IntraBlueprintTransition.Config
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSurfaceBehindViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSurfaceBehindViewBinder.kt
index fd27dc39299b..3934917d13c4 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSurfaceBehindViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSurfaceBehindViewBinder.kt
@@ -16,7 +16,7 @@
package com.android.systemui.keyguard.ui.binder
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.systemui.keyguard.WindowManagerLockscreenVisibilityManager
import com.android.systemui.keyguard.ui.viewmodel.KeyguardSurfaceBehindViewModel
import kotlinx.coroutines.CoroutineScope
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/LightRevealScrimViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/LightRevealScrimViewBinder.kt
index b2ee68967878..2df17c39d90d 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/LightRevealScrimViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/LightRevealScrimViewBinder.kt
@@ -18,7 +18,7 @@ package com.android.systemui.keyguard.ui.binder
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.systemui.keyguard.ui.viewmodel.LightRevealScrimViewModel
import com.android.systemui.lifecycle.repeatWhenAttached
import com.android.systemui.statusbar.LightRevealScrim
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/WindowManagerLockscreenVisibilityViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/WindowManagerLockscreenVisibilityViewBinder.kt
index ae46dd3a6ef3..b1ce47ee79e6 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/WindowManagerLockscreenVisibilityViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/WindowManagerLockscreenVisibilityViewBinder.kt
@@ -16,7 +16,7 @@
package com.android.systemui.keyguard.ui.binder
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.systemui.keyguard.WindowManagerLockscreenVisibilityManager
import com.android.systemui.keyguard.ui.viewmodel.WindowManagerLockscreenVisibilityViewModel
import kotlinx.coroutines.CoroutineScope
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt
index dd8980dabb23..08d35a72ab12 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt
@@ -47,7 +47,6 @@ import androidx.constraintlayout.widget.ConstraintSet.PARENT_ID
import androidx.constraintlayout.widget.ConstraintSet.START
import androidx.constraintlayout.widget.ConstraintSet.TOP
import androidx.core.view.isInvisible
-import com.android.app.tracing.coroutines.createCoroutineTracingContext
import com.android.internal.policy.SystemBarUtils
import com.android.keyguard.ClockEventController
import com.android.keyguard.KeyguardClockSwitch
@@ -57,6 +56,7 @@ import com.android.systemui.broadcast.BroadcastDispatcher
import com.android.systemui.common.ui.ConfigurationState
import com.android.systemui.communal.ui.binder.CommunalTutorialIndicatorViewBinder
import com.android.systemui.communal.ui.viewmodel.CommunalTutorialIndicatorViewModel
+import com.android.systemui.coroutines.newTracingContext
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main
@@ -189,7 +189,7 @@ constructor(
CoroutineScope(
applicationScope.coroutineContext +
Job() +
- createCoroutineTracingContext("KeyguardPreviewRenderer")
+ newTracingContext("KeyguardPreviewRenderer")
)
disposables += DisposableHandle { coroutineScope.cancel() }
clockController.setFallbackWeatherData(WeatherData.getPlaceholderWeatherData())
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardRemotePreviewManager.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardRemotePreviewManager.kt
index 075a1d2893f7..9355200daec7 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardRemotePreviewManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardRemotePreviewManager.kt
@@ -25,7 +25,7 @@ import android.os.Messenger
import android.util.ArrayMap
import android.util.Log
import androidx.annotation.VisibleForTesting
-import com.android.app.tracing.coroutines.runBlocking
+import com.android.app.tracing.coroutines.runBlockingTraced as runBlocking
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.Background
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModel.kt
index 0d55709e94d6..f765e60c1c70 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModel.kt
@@ -19,6 +19,7 @@ package com.android.systemui.keyguard.ui.viewmodel
import androidx.annotation.VisibleForTesting
import com.android.app.tracing.FlowTracing.traceEmissionCount
+import com.android.app.tracing.coroutines.flow.flowName
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardQuickAffordanceInteractor
@@ -141,6 +142,7 @@ constructor(
fadeInAlpha,
fadeOutAlpha,
)
+ .flowName("transitionAlpha")
.stateIn(
scope = applicationScope,
started = SharingStarted.WhileSubscribed(),
diff --git a/packages/SystemUI/src/com/android/systemui/lifecycle/Hydrator.kt b/packages/SystemUI/src/com/android/systemui/lifecycle/Hydrator.kt
index df1394bbfa5f..7c02f28c0696 100644
--- a/packages/SystemUI/src/com/android/systemui/lifecycle/Hydrator.kt
+++ b/packages/SystemUI/src/com/android/systemui/lifecycle/Hydrator.kt
@@ -19,7 +19,7 @@ package com.android.systemui.lifecycle
import androidx.compose.runtime.State
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.snapshots.StateFactoryMarker
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.app.tracing.coroutines.traceCoroutine
import kotlinx.coroutines.awaitCancellation
import kotlinx.coroutines.coroutineScope
diff --git a/packages/SystemUI/src/com/android/systemui/lifecycle/RepeatWhenAttached.kt b/packages/SystemUI/src/com/android/systemui/lifecycle/RepeatWhenAttached.kt
index 555969859a1f..a86bfb18fb70 100644
--- a/packages/SystemUI/src/com/android/systemui/lifecycle/RepeatWhenAttached.kt
+++ b/packages/SystemUI/src/com/android/systemui/lifecycle/RepeatWhenAttached.kt
@@ -17,7 +17,6 @@
package com.android.systemui.lifecycle
-import android.os.Trace
import android.view.View
import android.view.ViewTreeObserver
import androidx.annotation.MainThread
@@ -25,11 +24,8 @@ import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.LifecycleRegistry
import androidx.lifecycle.lifecycleScope
-import com.android.app.tracing.coroutines.createCoroutineTracingContext
-import com.android.app.tracing.coroutines.traceCoroutine
-import com.android.systemui.Flags.coroutineTracing
+import com.android.systemui.coroutines.newTracingContext
import com.android.systemui.util.Assert
-import com.android.systemui.util.Compile
import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow
import com.android.systemui.utils.coroutines.flow.flatMapLatestConflated
import kotlin.coroutines.CoroutineContext
@@ -83,25 +79,13 @@ fun View.repeatWhenAttached(
// default behavior. Instead, we want it to run on the view's UI thread since the user will
// presumably want to call view methods that require being called from said UI thread.
val lifecycleCoroutineContext = MAIN_DISPATCHER_SINGLETON + coroutineContext
- val traceName =
- if (Compile.IS_DEBUG && coroutineTracing()) {
- inferTraceSectionName()
- } else {
- DEFAULT_TRACE_NAME
- }
var lifecycleOwner: ViewLifecycleOwner? = null
val onAttachListener =
object : View.OnAttachStateChangeListener {
override fun onViewAttachedToWindow(v: View) {
Assert.isMainThread()
lifecycleOwner?.onDestroy()
- lifecycleOwner =
- createLifecycleOwnerAndRun(
- traceName,
- view,
- lifecycleCoroutineContext,
- block,
- )
+ lifecycleOwner = createLifecycleOwnerAndRun(view, lifecycleCoroutineContext, block)
}
override fun onViewDetachedFromWindow(v: View) {
@@ -112,13 +96,7 @@ fun View.repeatWhenAttached(
addOnAttachStateChangeListener(onAttachListener)
if (view.isAttachedToWindow) {
- lifecycleOwner =
- createLifecycleOwnerAndRun(
- traceName,
- view,
- lifecycleCoroutineContext,
- block,
- )
+ lifecycleOwner = createLifecycleOwnerAndRun(view, lifecycleCoroutineContext, block)
}
return DisposableHandle {
@@ -131,14 +109,15 @@ fun View.repeatWhenAttached(
}
private fun createLifecycleOwnerAndRun(
- nameForTrace: String,
view: View,
coroutineContext: CoroutineContext,
block: suspend LifecycleOwner.(View) -> Unit,
): ViewLifecycleOwner {
return ViewLifecycleOwner(view).apply {
onCreate()
- lifecycleScope.launch(coroutineContext) { traceCoroutine(nameForTrace) { block(view) } }
+ // TODO(b/370595466): Refactor to support installing CoroutineTracingContext on the
+ // top-level CoroutineScope used as the lifecycleScope
+ lifecycleScope.launch(coroutineContext) { block(view) }
}
}
@@ -167,9 +146,7 @@ private fun createLifecycleOwnerAndRun(
* └───────────────┴───────────────────┴──────────────┴─────────────────┘
* ```
*/
-class ViewLifecycleOwner(
- private val view: View,
-) : LifecycleOwner {
+class ViewLifecycleOwner(private val view: View) : LifecycleOwner {
private val windowVisibleListener =
ViewTreeObserver.OnWindowVisibilityChangeListener { updateState() }
@@ -205,28 +182,6 @@ class ViewLifecycleOwner(
}
}
-private fun isFrameInteresting(frame: StackWalker.StackFrame): Boolean =
- frame.className != CURRENT_CLASS_NAME && frame.className != JAVA_ADAPTER_CLASS_NAME
-
-/** Get a name for the trace section include the name of the call site. */
-private fun inferTraceSectionName(): String {
- try {
- Trace.traceBegin(Trace.TRACE_TAG_APP, "RepeatWhenAttachedKt#inferTraceSectionName")
- val interestingFrame =
- StackWalker.getInstance().walk { stream ->
- stream.filter(::isFrameInteresting).limit(5).findFirst()
- }
- return if (interestingFrame.isPresent) {
- val f = interestingFrame.get()
- "${f.className}#${f.methodName}:${f.lineNumber} [$DEFAULT_TRACE_NAME]"
- } else {
- DEFAULT_TRACE_NAME
- }
- } finally {
- Trace.traceEnd(Trace.TRACE_TAG_APP)
- }
-}
-
/**
* Runs the given [block] in a new coroutine when `this` [View]'s Window's [WindowLifecycleState] is
* at least at [state] (or immediately after calling this function if the window is already at least
@@ -368,8 +323,7 @@ private val ViewTreeObserver.isWindowVisible
* an extension function, and plumbing dagger-injected instances for static usage has little
* benefit.
*/
-private val MAIN_DISPATCHER_SINGLETON =
- Dispatchers.Main + createCoroutineTracingContext("RepeatWhenAttached")
+private val MAIN_DISPATCHER_SINGLETON = Dispatchers.Main + newTracingContext("RepeatWhenAttached")
private const val DEFAULT_TRACE_NAME = "repeatWhenAttached"
private const val CURRENT_CLASS_NAME = "com.android.systemui.lifecycle.RepeatWhenAttachedKt"
private const val JAVA_ADAPTER_CLASS_NAME = "com.android.systemui.util.kotlin.JavaAdapterKt"
diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorComponent.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorComponent.kt
index 544dbddeb3f0..f40ad065e5fc 100644
--- a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorComponent.kt
+++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorComponent.kt
@@ -16,13 +16,13 @@
package com.android.systemui.mediaprojection.appselector
-import com.android.app.tracing.coroutines.createCoroutineTracingContext
import android.app.Activity
import android.content.ComponentName
import android.content.Context
import android.os.UserHandle
import androidx.lifecycle.DefaultLifecycleObserver
import com.android.launcher3.icons.IconFactory
+import com.android.systemui.coroutines.newTracingContext
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.mediaprojection.appselector.data.ActivityTaskManagerLabelLoader
import com.android.systemui.mediaprojection.appselector.data.ActivityTaskManagerThumbnailLoader
@@ -134,7 +134,11 @@ interface MediaProjectionAppSelectorModule {
@MediaProjectionAppSelector
@MediaProjectionAppSelectorScope
fun provideCoroutineScope(@Application applicationScope: CoroutineScope): CoroutineScope =
- CoroutineScope(applicationScope.coroutineContext + SupervisorJob() + createCoroutineTracingContext("MediaProjectionAppSelectorScope"))
+ CoroutineScope(
+ applicationScope.coroutineContext +
+ SupervisorJob() +
+ newTracingContext("MediaProjectionAppSelectorScope")
+ )
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/domain/GestureInteractor.kt b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/domain/GestureInteractor.kt
index 96386e520d5a..0166176721c3 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/domain/GestureInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/domain/GestureInteractor.kt
@@ -16,7 +16,6 @@
package com.android.systemui.navigationbar.gestural.domain
-import com.android.app.tracing.coroutines.flow.flowOn
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main
@@ -35,6 +34,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.mapLatest
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
diff --git a/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskController.kt b/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskController.kt
index 3aa9daac4866..d0f6f7961889 100644
--- a/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskController.kt
+++ b/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskController.kt
@@ -37,7 +37,7 @@ import android.os.UserManager
import android.provider.Settings
import android.widget.Toast
import androidx.annotation.VisibleForTesting
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.Background
diff --git a/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt b/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt
index 9c5231d716da..49b44cb95e46 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt
@@ -23,7 +23,9 @@ import android.graphics.Rect
import android.os.Bundle
import android.util.IndentingPrintWriter
import android.view.LayoutInflater
+import android.view.MotionEvent
import android.view.View
+import android.view.ViewConfiguration
import android.view.ViewGroup
import android.widget.FrameLayout
import androidx.activity.OnBackPressedDispatcher
@@ -35,6 +37,7 @@ import androidx.compose.animation.core.tween
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.animation.togetherWith
+import androidx.compose.foundation.ScrollState
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
@@ -43,6 +46,7 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.layout.windowInsetsPadding
+import androidx.compose.foundation.verticalScroll
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
@@ -83,6 +87,7 @@ import com.android.systemui.Dumpable
import com.android.systemui.compose.modifiers.sysuiResTag
import com.android.systemui.dump.DumpManager
import com.android.systemui.lifecycle.repeatWhenAttached
+import com.android.systemui.lifecycle.setSnapshotBinding
import com.android.systemui.media.controls.ui.controller.MediaHierarchyManager
import com.android.systemui.media.controls.ui.view.MediaHost
import com.android.systemui.media.dagger.MediaModule.QS_PANEL
@@ -145,6 +150,7 @@ constructor(
private val qqsVisible = MutableStateFlow(false)
private val qqsPositionOnRoot = Rect()
private val composeViewPositionOnScreen = Rect()
+ private val scrollState = ScrollState(0)
// Inside object for namespacing
private val notificationScrimClippingParams =
@@ -210,6 +216,9 @@ constructor(
context,
{ notificationScrimClippingParams.isEnabled },
{ notificationScrimClippingParams.params.top },
+ // Only allow scrolling when we are fully expanded. That way, we don't intercept
+ // swipes in lockscreen (when somehow QS is receiving touches).
+ { scrollState.canScrollForward && viewModel.expansionState.value.progress >= 1f },
)
frame.addView(
composeView,
@@ -488,12 +497,8 @@ constructor(
private fun setListenerCollections() {
lifecycleScope.launch {
lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
- launch {
- // TODO
- // setListenerJob(
- // scrollListener,
- //
- // )
+ this@QSFragmentCompose.view?.setSnapshotBinding {
+ scrollListener.value?.onQsPanelScrollChanged(scrollState.value)
}
launch {
setListenerJob(
@@ -528,6 +533,7 @@ constructor(
viewModel.containerViewModel.quickQuickSettingsViewModel.squishinessViewModel
.squishiness
.collectAsStateWithLifecycle()
+
Column(modifier = Modifier.sysuiResTag("quick_qs_panel")) {
Box(
modifier =
@@ -591,7 +597,12 @@ constructor(
modifier =
Modifier.element(ElementKeys.QuickSettingsContent).fillMaxSize().weight(1f)
) {
- Column {
+ DisposableEffect(Unit) {
+ lifecycleScope.launch { scrollState.scrollTo(0) }
+ onDispose { lifecycleScope.launch { scrollState.scrollTo(0) } }
+ }
+
+ Column(modifier = Modifier.verticalScroll(scrollState)) {
Spacer(
modifier = Modifier.height { qqsPadding + qsExtraPadding.roundToPx() }
)
@@ -601,15 +612,14 @@ constructor(
)
}
}
- QuickSettingsTheme {
- FooterActions(
- viewModel = viewModel.footerActionsViewModel,
- qsVisibilityLifecycleOwner = this@QSFragmentCompose,
- modifier =
- Modifier.sysuiResTag("qs_footer_actions")
- .element(ElementKeys.FooterActions),
- )
- }
+ }
+ QuickSettingsTheme {
+ FooterActions(
+ viewModel = viewModel.footerActionsViewModel,
+ qsVisibilityLifecycleOwner = this@QSFragmentCompose,
+ modifier =
+ Modifier.sysuiResTag("qs_footer_actions").element(ElementKeys.FooterActions),
+ )
}
}
}
@@ -791,13 +801,17 @@ private class ExpansionTransition(currentProgress: Float) :
private const val EDIT_MODE_TIME_MILLIS = 500
/**
- * Ignore touches below the value returned by [clippingTopProvider], when clipping is enabled, as
- * per [clippingEnabledProvider].
+ * Performs different touch handling based on the state of the ComposeView:
+ * * Ignore touches below the value returned by [clippingTopProvider], when clipping is enabled, as
+ * per [clippingEnabledProvider].
+ * * Intercept touches that would overscroll QS forward and instead allow them to be used to close
+ * the shade.
*/
private class FrameLayoutTouchPassthrough(
context: Context,
private val clippingEnabledProvider: () -> Boolean,
private val clippingTopProvider: () -> Int,
+ private val canScrollForwardQs: () -> Boolean,
) : FrameLayout(context) {
override fun isTransformedTouchPointInView(
x: Float,
@@ -811,4 +825,32 @@ private class FrameLayoutTouchPassthrough(
super.isTransformedTouchPointInView(x, y, child, outLocalPoint)
}
}
+
+ val touchSlop = ViewConfiguration.get(context).scaledTouchSlop
+ var downY = 0f
+
+ override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
+ // If there's a touch on this view and we can scroll down, we don't want to be intercepted
+ val action = ev.actionMasked
+
+ when (action) {
+ MotionEvent.ACTION_DOWN -> {
+ // If we can scroll down, make sure none of our parents intercepts us.
+ if (canScrollForwardQs()) {
+ parent?.requestDisallowInterceptTouchEvent(true)
+ }
+ downY = ev.y
+ }
+
+ MotionEvent.ACTION_MOVE -> {
+ val y = ev.y.toInt()
+ val yDiff: Float = y - downY
+ if (yDiff < -touchSlop && !canScrollForwardQs()) {
+ // Intercept touches that are overscrolling.
+ return true
+ }
+ }
+ }
+ return super.onInterceptTouchEvent(ev)
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/PaginatedGridLayout.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/PaginatedGridLayout.kt
index e749475479d8..d55763aaeddb 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/PaginatedGridLayout.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/PaginatedGridLayout.kt
@@ -19,7 +19,7 @@ package com.android.systemui.qs.panels.ui.compose
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
-import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.requiredHeight
import androidx.compose.foundation.pager.HorizontalPager
import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.material.icons.Icons
@@ -97,7 +97,9 @@ constructor(
TileGrid(tiles = page, modifier = Modifier, editModeStart = {})
}
}
- Box(modifier = Modifier.height(FooterHeight).fillMaxWidth()) {
+ // Use requiredHeight so it won't be squished if the view doesn't quite fit. As this is
+ // expected to be inside a scrollable container, this should not be an issue.
+ Box(modifier = Modifier.requiredHeight(FooterHeight).fillMaxWidth()) {
PagerDots(
pagerState = pagerState,
activeColor = MaterialTheme.colorScheme.primary,
diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/QuickQuickSettings.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/QuickQuickSettings.kt
index f36f45c7942d..1c7a334d3ef2 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/QuickQuickSettings.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/QuickQuickSettings.kt
@@ -41,8 +41,7 @@ fun SceneScope.QuickQuickSettings(
viewModel: QuickQuickSettingsViewModel,
modifier: Modifier = Modifier,
) {
- val sizedTiles by
- viewModel.tileViewModels.collectAsStateWithLifecycle(initialValue = emptyList())
+ val sizedTiles by viewModel.tileViewModels.collectAsStateWithLifecycle()
val tiles = sizedTiles.fastMap { it.tile }
val bounceables = remember(sizedTiles) { List(sizedTiles.size) { BounceableTileViewModel() } }
val squishiness by viewModel.squishinessViewModel.squishiness.collectAsStateWithLifecycle()
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileCoroutineScopeFactory.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileCoroutineScopeFactory.kt
index b8f4ab40bb1d..dde36289f139 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileCoroutineScopeFactory.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileCoroutineScopeFactory.kt
@@ -16,7 +16,7 @@
package com.android.systemui.qs.tiles.base.viewmodel
-import com.android.app.tracing.coroutines.createCoroutineTracingContext
+import com.android.systemui.coroutines.newTracingContext
import com.android.systemui.dagger.qualifiers.Application
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
@@ -28,5 +28,7 @@ class QSTileCoroutineScopeFactory
constructor(@Application private val applicationScope: CoroutineScope) {
fun create(): CoroutineScope =
- CoroutineScope(applicationScope.coroutineContext + SupervisorJob() + createCoroutineTracingContext("QSTileScope"))
+ CoroutineScope(
+ applicationScope.coroutineContext + SupervisorJob() + newTracingContext("QSTileScope")
+ )
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogManager.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogManager.kt
index ae56c2aad4e9..f6749715e1fd 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogManager.kt
@@ -15,12 +15,12 @@
*/
package com.android.systemui.qs.tiles.dialog
-import com.android.app.tracing.coroutines.createCoroutineTracingContext
import android.util.Log
import com.android.internal.jank.InteractionJankMonitor
import com.android.systemui.animation.DialogCuj
import com.android.systemui.animation.DialogTransitionAnimator
import com.android.systemui.animation.Expandable
+import com.android.systemui.coroutines.newTracingContext
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.statusbar.phone.SystemUIDialog
@@ -63,7 +63,7 @@ constructor(
}
return
} else {
- coroutineScope = CoroutineScope(bgDispatcher + createCoroutineTracingContext("InternetDialogScope"))
+ coroutineScope = CoroutineScope(bgDispatcher + newTracingContext("InternetDialogScope"))
dialog =
dialogFactory
.create(aboveStatusBar, canConfigMobileData, canConfigWifi, coroutineScope)
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/location/domain/interactor/LocationTileUserActionInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/location/domain/interactor/LocationTileUserActionInteractor.kt
index ac75932b8fee..14115444fe49 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/location/domain/interactor/LocationTileUserActionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/location/domain/interactor/LocationTileUserActionInteractor.kt
@@ -16,9 +16,9 @@
package com.android.systemui.qs.tiles.impl.location.domain.interactor
-import com.android.app.tracing.coroutines.createCoroutineTracingContext
import android.content.Intent
import android.provider.Settings
+import com.android.systemui.coroutines.newTracingContext
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.plugins.ActivityStarter
@@ -53,9 +53,11 @@ constructor(
val wasEnabled: Boolean = input.data.isEnabled
if (keyguardController.isMethodSecure() && keyguardController.isShowing()) {
activityStarter.postQSRunnableDismissingKeyguard {
- CoroutineScope(applicationScope.coroutineContext + createCoroutineTracingContext("LocationTileScope")).launch {
- locationController.setLocationEnabled(!wasEnabled)
- }
+ CoroutineScope(
+ applicationScope.coroutineContext +
+ newTracingContext("LocationTileScope")
+ )
+ .launch { locationController.setLocationEnabled(!wasEnabled) }
}
} else {
withContext(coroutineContext) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/modes/domain/interactor/ModesTileDataInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/modes/domain/interactor/ModesTileDataInteractor.kt
index 40591bf56e0a..cc14e71986f5 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/modes/domain/interactor/ModesTileDataInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/modes/domain/interactor/ModesTileDataInteractor.kt
@@ -18,7 +18,7 @@ package com.android.systemui.qs.tiles.impl.modes.domain.interactor
import android.content.Context
import android.os.UserHandle
-import com.android.app.tracing.coroutines.flow.map
+import com.android.app.tracing.coroutines.flow.flowName
import com.android.systemui.common.shared.model.Icon
import com.android.systemui.common.shared.model.asIcon
import com.android.systemui.dagger.qualifiers.Background
@@ -37,6 +37,7 @@ import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.flowOn
+import kotlinx.coroutines.flow.map
class ModesTileDataInteractor
@Inject
@@ -59,6 +60,7 @@ constructor(
fun tileData() =
zenModeInteractor.activeModes
.map { activeModes -> buildTileData(activeModes) }
+ .flowName("tileData")
.flowOn(bgDispatcher)
.distinctUntilChanged()
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/saver/domain/DataSaverDialogDelegate.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/saver/domain/DataSaverDialogDelegate.kt
index 468e180a6e41..f03c7521931c 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/saver/domain/DataSaverDialogDelegate.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/saver/domain/DataSaverDialogDelegate.kt
@@ -16,12 +16,12 @@
package com.android.systemui.qs.tiles.impl.saver.domain
-import com.android.app.tracing.coroutines.createCoroutineTracingContext
import android.content.Context
import android.content.DialogInterface
import android.content.SharedPreferences
import android.os.Bundle
import com.android.internal.R
+import com.android.systemui.coroutines.newTracingContext
import com.android.systemui.qs.tiles.impl.saver.domain.interactor.DataSaverTileUserActionInteractor
import com.android.systemui.statusbar.phone.SystemUIDialog
import com.android.systemui.statusbar.policy.DataSaverController
@@ -45,9 +45,8 @@ class DataSaverDialogDelegate(
setTitle(R.string.data_saver_enable_title)
setMessage(R.string.data_saver_description)
setPositiveButton(R.string.data_saver_enable_button) { _: DialogInterface?, _ ->
- CoroutineScope(backgroundContext + createCoroutineTracingContext("DataSaverDialogScope")).launch {
- dataSaverController.setDataSaverEnabled(true)
- }
+ CoroutineScope(backgroundContext + newTracingContext("DataSaverDialogScope"))
+ .launch { dataSaverController.setDataSaverEnabled(true) }
sharedPreferences
.edit()
diff --git a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt
index ce942fefa393..47254775618c 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt
@@ -19,7 +19,7 @@ package com.android.systemui.scene.ui.viewmodel
import android.view.MotionEvent
import android.view.View
import androidx.compose.runtime.getValue
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.compose.animation.scene.ContentKey
import com.android.compose.animation.scene.DefaultEdgeDetector
import com.android.compose.animation.scene.ObservableTransitionState
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ActionExecutor.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ActionExecutor.kt
index 54e0319da58f..17b1b6d91229 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ActionExecutor.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ActionExecutor.kt
@@ -26,7 +26,7 @@ import android.os.UserHandle
import android.util.Log
import android.util.Pair
import android.view.Window
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.internal.app.ChooserActivity
import com.android.systemui.dagger.qualifiers.Application
import dagger.assisted.Assisted
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ActionIntentExecutor.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ActionIntentExecutor.kt
index 9e622801a01b..7b01c36489fb 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ActionIntentExecutor.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ActionIntentExecutor.kt
@@ -31,7 +31,7 @@ import android.view.RemoteAnimationAdapter
import android.view.RemoteAnimationTarget
import android.view.WindowManager
import android.view.WindowManagerGlobal
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.internal.infra.ServiceConnector
import com.android.systemui.Flags
import com.android.systemui.dagger.SysUISingleton
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotProxyService.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotProxyService.kt
index c8067df114fc..6df22f036273 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotProxyService.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotProxyService.kt
@@ -21,7 +21,7 @@ import android.os.RemoteException
import android.util.Log
import androidx.lifecycle.LifecycleService
import androidx.lifecycle.lifecycleScope
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.shade.ShadeExpansionStateManager
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotSoundController.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotSoundController.kt
index d3a7fc4a3e4a..7aeec47241cb 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotSoundController.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotSoundController.kt
@@ -18,7 +18,7 @@ package com.android.systemui.screenshot
import android.media.MediaPlayer
import android.util.Log
-import com.android.app.tracing.coroutines.async
+import com.android.app.tracing.coroutines.asyncTraced as async
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.Background
import javax.inject.Inject
diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java
index cae141d014a8..5699557c14e7 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java
@@ -35,7 +35,6 @@ import androidx.core.view.ViewKt;
import com.android.internal.annotations.VisibleForTesting;
import com.android.keyguard.AuthKeyguardMessageArea;
import com.android.keyguard.KeyguardUnfoldTransition;
-import com.android.keyguard.LockIconViewController;
import com.android.systemui.Dumpable;
import com.android.systemui.animation.ActivityTransitionAnimator;
import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor;
@@ -44,7 +43,6 @@ import com.android.systemui.bouncer.shared.flag.ComposeBouncerFlags;
import com.android.systemui.bouncer.ui.binder.BouncerViewBinder;
import com.android.systemui.classifier.FalsingCollector;
import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor;
import com.android.systemui.dock.DockManager;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.flags.FeatureFlagsClassic;
@@ -75,7 +73,6 @@ import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.DozeScrimController;
import com.android.systemui.statusbar.phone.DozeServiceHost;
import com.android.systemui.statusbar.phone.PhoneStatusBarViewController;
-import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.window.StatusBarWindowStateController;
import com.android.systemui.unfold.SysUIUnfoldComponent;
import com.android.systemui.unfold.UnfoldTransitionProgressProvider;
@@ -101,9 +98,7 @@ public class NotificationShadeWindowViewController implements Dumpable {
private final NotificationShadeDepthController mDepthController;
private final NotificationStackScrollLayoutController mNotificationStackScrollLayoutController;
private final LockscreenShadeTransitionController mLockscreenShadeTransitionController;
- private final LockIconViewController mLockIconViewController;
private final ShadeLogger mShadeLogger;
- private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
private final StatusBarWindowStateController mStatusBarWindowStateController;
private final KeyguardUnlockAnimationController mKeyguardUnlockAnimationController;
private final AmbientState mAmbientState;
@@ -174,9 +169,7 @@ public class NotificationShadeWindowViewController implements Dumpable {
PanelExpansionInteractor panelExpansionInteractor,
ShadeExpansionStateManager shadeExpansionStateManager,
NotificationStackScrollLayoutController notificationStackScrollLayoutController,
- StatusBarKeyguardViewManager statusBarKeyguardViewManager,
StatusBarWindowStateController statusBarWindowStateController,
- LockIconViewController lockIconViewController,
CentralSurfaces centralSurfaces,
DozeServiceHost dozeServiceHost,
DozeScrimController dozeScrimController,
@@ -210,9 +203,7 @@ public class NotificationShadeWindowViewController implements Dumpable {
mShadeExpansionStateManager = shadeExpansionStateManager;
mDepthController = depthController;
mNotificationStackScrollLayoutController = notificationStackScrollLayoutController;
- mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
mStatusBarWindowStateController = statusBarWindowStateController;
- mLockIconViewController = lockIconViewController;
mShadeLogger = shadeLogger;
mService = centralSurfaces;
mDozeServiceHost = dozeServiceHost;
@@ -259,7 +250,6 @@ public class NotificationShadeWindowViewController implements Dumpable {
mDisableSubpixelTextTransitionListener));
}
- lockIconViewController.setLockIconView(mView.findViewById(R.id.lock_icon_view));
dumpManager.registerDumpable(this);
}
@@ -392,9 +382,6 @@ public class NotificationShadeWindowViewController implements Dumpable {
}
if (mKeyguardUnlockAnimationController.isPlayingCannedUnlockAnimation()) {
- // If the user was sliding their finger across the lock screen,
- // we may have been intercepting the touch and forwarding it to the
- // UDFPS affordance via mStatusBarKeyguardViewManager.onTouch (see below).
// If this touch ended up unlocking the device, we want to cancel the touch
// immediately, so we don't cause swipe or expand animations afterwards.
cancelCurrentTouch();
@@ -419,9 +406,6 @@ public class NotificationShadeWindowViewController implements Dumpable {
&& mDreamingWakeupGestureHandler.onTouchEvent(ev)) {
return logDownDispatch(ev, "dream wakeup gesture handled", true);
}
- if (mStatusBarKeyguardViewManager.dispatchTouchEvent(ev)) {
- return logDownDispatch(ev, "dispatched to Keyguard", true);
- }
if (mBrightnessMirror != null
&& mBrightnessMirror.getVisibility() == View.VISIBLE) {
// Disallow new pointers while the brightness mirror is visible. This is so that
@@ -512,7 +496,6 @@ public class NotificationShadeWindowViewController implements Dumpable {
if (mStatusBarStateController.isDozing()
&& !mDozeServiceHost.isPulsing()
&& !mDockManager.isDocked()
- && !mLockIconViewController.willHandleTouchWhileDozing(ev)
) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
mShadeLogger.d("NSWVC: capture all touch events in always-on");
@@ -520,22 +503,8 @@ public class NotificationShadeWindowViewController implements Dumpable {
return true;
}
- if (mStatusBarKeyguardViewManager.shouldInterceptTouchEvent(ev)) {
- // Don't allow touches to proceed to underlying views if alternate
- // bouncer is showing
- if (ev.getAction() == MotionEvent.ACTION_DOWN) {
- mShadeLogger.d("NSWVC: alt bouncer showing");
- }
- return true;
- }
-
- boolean bouncerShowing;
- if (DeviceEntryUdfpsRefactor.isEnabled()) {
- bouncerShowing = mPrimaryBouncerInteractor.isBouncerShowing()
+ boolean bouncerShowing = mPrimaryBouncerInteractor.isBouncerShowing()
|| mAlternateBouncerInteractor.isVisibleState();
- } else {
- bouncerShowing = mService.isBouncerShowing();
- }
if (mPanelExpansionInteractor.isFullyExpanded()
&& !bouncerShowing
&& !mStatusBarStateController.isDozing()) {
@@ -603,9 +572,6 @@ public class NotificationShadeWindowViewController implements Dumpable {
if (mStatusBarStateController.isDozing()) {
handled = !mDozeServiceHost.isPulsing();
}
- if (mStatusBarKeyguardViewManager.onTouch(ev)) {
- return true;
- }
if (MigrateClocksToBlueprint.isEnabled()) {
if (mLastInterceptWasDragDownHelper && (mDragDownHelper.isDraggingDown())) {
// we still want to finish our drag down gesture when locking the screen
diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImpl.kt
index 949d2aa36bf3..460bfbbcb3ab 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImpl.kt
@@ -16,6 +16,7 @@
package com.android.systemui.shade.domain.interactor
+import com.android.app.tracing.coroutines.flow.flowName
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.keyguard.data.repository.KeyguardRepository
@@ -62,17 +63,20 @@ constructor(
override val isShadeEnabled: StateFlow<Boolean> =
disableFlagsRepository.disableFlags
.map { it.isShadeEnabled() }
+ .flowName("isShadeEnabled")
.stateIn(scope, SharingStarted.Eagerly, initialValue = false)
override val isQsEnabled: StateFlow<Boolean> =
disableFlagsRepository.disableFlags
.map { it.isQuickSettingsEnabled() }
+ .flowName("isQsEnabled")
.stateIn(scope, SharingStarted.Eagerly, initialValue = false)
override val isAnyFullyExpanded: StateFlow<Boolean> =
anyExpansion
.map { it >= 1f }
.distinctUntilChanged()
+ .flowName("isAnyFullyExpanded")
.stateIn(scope, SharingStarted.Eagerly, initialValue = false)
override val isShadeFullyExpanded: Flow<Boolean> =
@@ -81,6 +85,7 @@ constructor(
override val isShadeAnyExpanded: StateFlow<Boolean> =
baseShadeInteractor.shadeExpansion
.map { it > 0 }
+ .flowName("isShadeAnyExpanded")
.stateIn(scope, SharingStarted.Eagerly, false)
override val isShadeFullyCollapsed: Flow<Boolean> =
@@ -88,6 +93,7 @@ constructor(
override val isUserInteracting: StateFlow<Boolean> =
combine(isUserInteractingWithShade, isUserInteractingWithQs) { shade, qs -> shade || qs }
+ .flowName("isUserInteracting")
.stateIn(scope, SharingStarted.Eagerly, false)
override val isShadeTouchable: Flow<Boolean> =
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActionsViewModel.kt b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActionsViewModel.kt
index 3113dc462e6a..4bdd36773655 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActionsViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeUserActionsViewModel.kt
@@ -16,7 +16,6 @@
package com.android.systemui.shade.ui.viewmodel
-import com.android.app.tracing.coroutines.flow.map
import com.android.compose.animation.scene.Swipe
import com.android.compose.animation.scene.SwipeDirection
import com.android.compose.animation.scene.UserAction
@@ -33,6 +32,7 @@ import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.filter
+import kotlinx.coroutines.flow.map
/**
* Models the UI state for the user actions that the user can perform to navigate to other scenes.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt
index 1481b734ff61..1ec5357d0d30 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt
@@ -15,7 +15,6 @@ import androidx.annotation.VisibleForTesting
import com.android.systemui.Dumpable
import com.android.systemui.ExpandHelper
import com.android.systemui.Gefingerpoken
-import com.android.systemui.biometrics.UdfpsKeyguardViewControllerLegacy
import com.android.systemui.classifier.Classifier
import com.android.systemui.classifier.FalsingCollector
import com.android.systemui.dagger.SysUISingleton
@@ -90,6 +89,7 @@ constructor(
@get:VisibleForTesting
var fractionToShade: Float = 0f
private set
+
private var useSplitShade: Boolean = false
private lateinit var nsslController: NotificationStackScrollLayoutController
lateinit var centralSurfaces: CentralSurfaces
@@ -161,9 +161,6 @@ constructor(
val distanceUntilShowingPulsingNotifications
get() = fullTransitionDistance
- /** The udfpsKeyguardViewController if it exists. */
- var mUdfpsKeyguardViewControllerLegacy: UdfpsKeyguardViewControllerLegacy? = null
-
/** The touch helper responsible for the drag down animation. */
val touchHelper =
DragDownHelper(
@@ -171,7 +168,7 @@ constructor(
this,
naturalScrollingSettingObserver,
shadeRepository,
- context
+ context,
)
private val splitShadeOverScroller: SplitShadeLockScreenOverScroller by lazy {
@@ -448,7 +445,6 @@ constructor(
val udfpsProgress = MathUtils.saturate(dragDownAmount / udfpsTransitionDistance)
shadeRepository.setUdfpsTransitionToFullShadeProgress(udfpsProgress)
- mUdfpsKeyguardViewControllerLegacy?.setTransitionToFullShadeProgress(udfpsProgress)
val statusBarProgress = MathUtils.saturate(dragDownAmount / statusBarTransitionDistance)
centralSurfaces.setTransitionToFullShadeProgress(statusBarProgress)
@@ -457,7 +453,7 @@ constructor(
private fun setDragDownAmountAnimated(
target: Float,
delay: Long = 0,
- endlistener: (() -> Unit)? = null
+ endlistener: (() -> Unit)? = null,
) {
logger.logDragDownAnimation(target)
val dragDownAnimator = ValueAnimator.ofFloat(dragDownAmount, target)
@@ -553,7 +549,7 @@ constructor(
private fun goToLockedShadeInternal(
expandView: View?,
animationHandler: ((Long) -> Unit)? = null,
- cancelAction: Runnable? = null
+ cancelAction: Runnable? = null,
) {
if (!shadeInteractor.isShadeEnabled.value) {
cancelAction?.run()
@@ -564,10 +560,7 @@ constructor(
var entry: NotificationEntry? = null
if (expandView is ExpandableNotificationRow) {
entry = expandView.entry
- entry.setUserExpanded(
- /* userExpanded= */ true,
- /* allowChildExpansion= */ true,
- )
+ entry.setUserExpanded(/* userExpanded= */ true, /* allowChildExpansion= */ true)
// Indicate that the group expansion is changing at this time -- this way the group
// and children backgrounds / divider animations will look correct.
entry.setGroupExpansionChanging(true)
@@ -594,9 +587,7 @@ constructor(
statusBarStateController.setLeaveOpenOnKeyguardHide(false)
draggedDownEntry?.apply {
setUserLocked(false)
- notifyHeightChanged(
- /* needsAnimation= */ false,
- )
+ notifyHeightChanged(/* needsAnimation= */ false)
draggedDownEntry = null
}
cancelAction?.run()
@@ -614,9 +605,7 @@ constructor(
// This call needs to be after updating the shade state since otherwise
// the scrimstate resets too early
if (animationHandler != null) {
- animationHandler.invoke(
- /* delay= */ 0,
- )
+ animationHandler.invoke(/* delay= */ 0)
} else {
performDefaultGoToFullShadeAnimation(0)
}
@@ -757,7 +746,7 @@ class DragDownHelper(
private val dragDownCallback: LockscreenShadeTransitionController,
private val naturalScrollingSettingObserver: NaturalScrollingSettingObserver,
private val shadeRepository: ShadeRepository,
- context: Context
+ context: Context,
) : Gefingerpoken {
private var dragDownAmountOnStart = 0.0f
@@ -932,7 +921,7 @@ class DragDownHelper(
@VisibleForTesting
fun cancelChildExpansion(
child: ExpandableView,
- animationDuration: Long = SPRING_BACK_ANIMATION_LENGTH_MS
+ animationDuration: Long = SPRING_BACK_ANIMATION_LENGTH_MS,
) {
if (child.actualHeight == child.collapsedHeight) {
expandCallback.setUserLockedChild(child, false)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/emptyshade/ui/viewmodel/EmptyShadeViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/emptyshade/ui/viewmodel/EmptyShadeViewModel.kt
index 695e088b5f8b..fbec6406e9d4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/emptyshade/ui/viewmodel/EmptyShadeViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/emptyshade/ui/viewmodel/EmptyShadeViewModel.kt
@@ -18,7 +18,6 @@ package com.android.systemui.statusbar.notification.emptyshade.ui.viewmodel
import android.content.Context
import android.icu.text.MessageFormat
-import com.android.app.tracing.coroutines.flow.flowOn
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dump.DumpManager
import com.android.systemui.modes.shared.ModesUi
@@ -40,6 +39,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map
/**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java
index 560028cb5640..4c7d90c12839 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java
@@ -830,4 +830,13 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
});
}
}
+
+ protected void dumpAppearAnimationProperties(IndentingPrintWriter pw, String[] args) {
+ pw.print("AppearAnimation: ");
+ pw.print("mDrawingAppearAnimation", mDrawingAppearAnimation);
+ pw.print("mAppearAnimationFraction", mAppearAnimationFraction);
+ pw.print("mIsHeadsUpAnimation", mIsHeadsUpAnimation);
+ pw.print("mTargetPoint", mTargetPoint);
+ pw.println();
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
index 49153d1d8eef..33dbbc233fa9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
@@ -3883,6 +3883,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
dumpHeights(pw);
}
showingLayout.dump(pw, args);
+ dumpAppearAnimationProperties(pw, args);
dumpCustomOutline(pw, args);
dumpClipping(pw, args);
if (getViewState() != null) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
index 00c5c40fc8ac..f3437b5732ae 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
@@ -2098,8 +2098,13 @@ public class NotificationStackScrollLayoutController implements Dumpable {
}
class TouchHandler implements Gefingerpoken {
+ private boolean mSwipeWantsIt = false;
+
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
+ // Reset on each call to intercept, and share swipe state with onTouchEvent()
+ // below when this method returns true.
+ mSwipeWantsIt = false;
mView.initDownStates(ev);
mView.handleEmptySpaceClick(ev);
@@ -2126,17 +2131,16 @@ public class NotificationStackScrollLayoutController implements Dumpable {
mView.startDraggingOnHun();
}
}
- boolean swipeWantsIt = false;
if (mLongPressedView == null && !mView.isBeingDragged()
&& !mView.isExpandingNotification()
&& !mView.getExpandedInThisMotion()
&& !mView.getOnlyScrollingInThisMotion()
&& !mView.getDisallowDismissInThisMotion()) {
- swipeWantsIt = mSwipeHelper.onInterceptTouchEvent(ev);
+ mSwipeWantsIt = mSwipeHelper.onInterceptTouchEvent(ev);
}
// Check if we need to clear any snooze leavebehinds
boolean isUp = ev.getActionMasked() == MotionEvent.ACTION_UP;
- if (!NotificationSwipeHelper.isTouchInView(ev, guts) && isUp && !swipeWantsIt &&
+ if (!NotificationSwipeHelper.isTouchInView(ev, guts) && isUp && !mSwipeWantsIt &&
!expandWantsIt && !scrollWantsIt) {
mView.setCheckForLeaveBehind(false);
mNotificationGutsManager.closeAndSaveGuts(true /* removeLeavebehind */,
@@ -2155,7 +2159,8 @@ public class NotificationStackScrollLayoutController implements Dumpable {
&& ev.getActionMasked() != MotionEvent.ACTION_DOWN) {
mJankMonitor.begin(mView, CUJ_NOTIFICATION_SHADE_SCROLL_FLING);
}
- return swipeWantsIt || scrollWantsIt || expandWantsIt || longPressWantsIt || hunWantsIt;
+ return mSwipeWantsIt || scrollWantsIt || expandWantsIt || longPressWantsIt ||
+ hunWantsIt;
}
@Override
@@ -2192,7 +2197,7 @@ public class NotificationStackScrollLayoutController implements Dumpable {
}
}
}
- boolean horizontalSwipeWantsIt = false;
+ boolean horizontalSwipeWantsIt = mSwipeWantsIt;
boolean scrollerWantsIt = false;
// NOTE: the order of these is important. If reversed, onScrollTouch will reset on an
// UP event, causing horizontalSwipeWantsIt to be set to true on vertical swipes.
@@ -2201,7 +2206,7 @@ public class NotificationStackScrollLayoutController implements Dumpable {
&& !mView.getExpandedInThisMotion()
&& !onlyScrollingInThisMotion
&& !mView.getDisallowDismissInThisMotion()) {
- horizontalSwipeWantsIt = mSwipeHelper.onTouchEvent(ev);
+ mSwipeHelper.onTouchEvent(ev);
}
if (mLongPressedView == null && mView.isExpanded() && !mSwipeHelper.isSwiping()
&& !expandingNotification && !mView.getDisallowScrollingInThisMotion()) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationScrollViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationScrollViewBinder.kt
index 87d70ba12012..fb42ee7908b2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationScrollViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationScrollViewBinder.kt
@@ -17,7 +17,8 @@
package com.android.systemui.statusbar.notification.stack.ui.viewbinder
import android.util.Log
-import com.android.app.tracing.coroutines.flow.filter
+import com.android.app.tracing.coroutines.flow.collectTraced
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.systemui.common.ui.ConfigurationState
import com.android.systemui.common.ui.view.onLayoutChanged
import com.android.systemui.dagger.SysUISingleton
@@ -37,7 +38,6 @@ import kotlinx.coroutines.DisposableHandle
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.filter
-import kotlinx.coroutines.launch
/** Binds the [NotificationScrollView]. */
@SysUISingleton
@@ -79,39 +79,39 @@ constructor(
launch {
viewModel
.shadeScrimShape(cornerRadius = scrimRadius, viewLeftOffset = viewLeftOffset)
- .collect { view.setScrimClippingShape(it) }
+ .collectTraced { view.setScrimClippingShape(it) }
}
- launch { viewModel.maxAlpha.collect { view.setMaxAlpha(it) } }
- launch { viewModel.scrolledToTop.collect { view.setScrolledToTop(it) } }
+ launch { viewModel.maxAlpha.collectTraced { view.setMaxAlpha(it) } }
+ launch { viewModel.scrolledToTop.collectTraced { view.setScrolledToTop(it) } }
launch {
- viewModel.expandFraction.collect { view.setExpandFraction(it.coerceIn(0f, 1f)) }
+ viewModel.expandFraction.collectTraced { view.setExpandFraction(it.coerceIn(0f, 1f)) }
}
- launch { viewModel.qsExpandFraction.collect { view.setQsExpandFraction(it) } }
+ launch { viewModel.qsExpandFraction.collectTraced { view.setQsExpandFraction(it) } }
launch {
- viewModel.isShowingStackOnLockscreen.collect {
+ viewModel.isShowingStackOnLockscreen.collectTraced {
view.setShowingStackOnLockscreen(it)
}
}
launch {
- viewModel.alphaForLockscreenFadeIn.collect { view.setAlphaForLockscreenFadeIn(it) }
+ viewModel.alphaForLockscreenFadeIn.collectTraced { view.setAlphaForLockscreenFadeIn(it) }
}
- launch { viewModel.isScrollable.collect { view.setScrollingEnabled(it) } }
- launch { viewModel.isDozing.collect { isDozing -> view.setDozing(isDozing) } }
+ launch { viewModel.isScrollable.collectTraced { view.setScrollingEnabled(it) } }
+ launch { viewModel.isDozing.collectTraced { isDozing -> view.setDozing(isDozing) } }
launch {
- viewModel.isPulsing.collect { isPulsing ->
+ viewModel.isPulsing.collectTraced { isPulsing ->
view.setPulsing(isPulsing, viewModel.shouldAnimatePulse.value)
}
}
launch {
viewModel.shouldResetStackTop
.filter { it }
- .collect { view.setStackTop(-(view.getHeadsUpInset().toFloat())) }
+ .collectTraced { view.setStackTop(-(view.getHeadsUpInset().toFloat())) }
}
launch {
- viewModel.shouldCloseGuts.filter { it }.collect { view.closeGutsOnSceneTouch() }
+ viewModel.shouldCloseGuts.filter { it }.collectTraced { view.closeGutsOnSceneTouch() }
}
- launch { viewModel.suppressHeightUpdates.collect { view.suppressHeightUpdates(it) } }
+ launch { viewModel.suppressHeightUpdates.collectTraced { view.suppressHeightUpdates(it) } }
launchAndDispose {
view.setSyntheticScrollConsumer(viewModel.syntheticScrollConsumer)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt
index f39af18afcea..878ae91391e9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt
@@ -20,6 +20,7 @@
package com.android.systemui.statusbar.notification.stack.ui.viewmodel
import androidx.annotation.VisibleForTesting
+import com.android.app.tracing.coroutines.flow.flowName
import com.android.systemui.common.shared.model.NotificationContainerBounds
import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor
import com.android.systemui.dagger.SysUISingleton
@@ -158,6 +159,7 @@ constructor(
) { shadeExpansion, qsExpansion ->
shadeExpansion || qsExpansion
}
+ .flowName("isAnyExpanded")
.stateIn(
scope = applicationScope,
started = SharingStarted.Eagerly,
@@ -175,6 +177,7 @@ constructor(
isAnyExpanded ->
isShadeLocked && isAnyExpanded
}
+ .flowName("isShadeLocked")
.stateIn(
scope = applicationScope,
started = SharingStarted.Eagerly,
@@ -227,6 +230,7 @@ constructor(
),
keyguardTransitionInteractor.transitionValue(LOCKSCREEN).map { it > 0f },
)
+ .flowName("isOnLockscreen")
.stateIn(
scope = applicationScope,
started = SharingStarted.Eagerly,
@@ -239,6 +243,7 @@ constructor(
combine(isOnLockscreen, isAnyExpanded) { isKeyguard, isAnyExpanded ->
isKeyguard && !isAnyExpanded
}
+ .flowName("isOnLockscreenWithoutShade")
.stateIn(
scope = applicationScope,
started = SharingStarted.Eagerly,
@@ -274,6 +279,7 @@ constructor(
combine(isOnGlanceableHub, isAnyExpanded) { isGlanceableHub, isAnyExpanded ->
isGlanceableHub && !isAnyExpanded
}
+ .flowName("isOnGlanceableHubWithoutShade")
.stateIn(
scope = applicationScope,
started = SharingStarted.Eagerly,
@@ -288,6 +294,7 @@ constructor(
isAnyExpanded ->
isDreaming && !isAnyExpanded
}
+ .flowName("isDreamingWithoutShade")
.stateIn(
scope = applicationScope,
started = SharingStarted.Eagerly,
@@ -345,6 +352,7 @@ constructor(
}
}
}
+ .flowName("shadeCollapseFadeIn")
.stateIn(
scope = applicationScope,
started = SharingStarted.WhileSubscribed(),
@@ -382,6 +390,7 @@ constructor(
bounds.copy(top = top, isAnimated = animate)
}
}
+ .flowName("bounds")
.stateIn(
scope = applicationScope,
started = SharingStarted.Lazily,
@@ -495,6 +504,7 @@ constructor(
// flatMapLatest below, the last value gets emitted, to avoid the randomness of `merge`.
val alphaForTransitionsAndShade =
merge(alphaForTransitions(viewState), alphaForShadeAndQsExpansion)
+ .flowName("alphaForTransitionsAndShade")
.stateIn(
// Use view-level scope instead of ApplicationScope, to prevent collection that
// never stops
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt
index 316e1f13bc2b..a34ac2e11c2e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt
@@ -22,7 +22,7 @@ import android.content.res.Resources
import android.hardware.biometrics.BiometricSourceType
import android.provider.Settings
import com.android.app.tracing.ListenersTracing.forEachTraced
-import com.android.app.tracing.coroutines.launch
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.systemui.Dumpable
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
index 069c6241491c..40e52935daf1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
@@ -1715,26 +1715,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
updateScrims();
}
- public void setHasBackdrop(boolean hasBackdrop) {
- for (ScrimState state : ScrimState.values()) {
- state.setHasBackdrop(hasBackdrop);
- }
-
- // Backdrop event may arrive after state was already applied,
- // in this case, back-scrim needs to be re-evaluated
- if (mState == ScrimState.AOD || mState == ScrimState.PULSING) {
- float newBehindAlpha = mState.getBehindAlpha();
- if (isNaN(newBehindAlpha)) {
- throw new IllegalStateException("Scrim opacity is NaN for state: " + mState
- + ", back: " + mBehindAlpha);
- }
- if (mBehindAlpha != newBehindAlpha) {
- mBehindAlpha = newBehindAlpha;
- updateScrims();
- }
- }
- }
-
private void setKeyguardFadingAway(boolean fadingAway, long duration) {
for (ScrimState state : ScrimState.values()) {
state.setKeyguardFadingAway(fadingAway, duration);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
index fbba3dc107f1..a0ab6120f372 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
@@ -210,7 +210,7 @@ public enum ScrimState {
@Override
public float getMaxLightRevealScrimAlpha() {
- return mWallpaperSupportsAmbientMode && !mHasBackdrop ? 0f : 1f;
+ return mWallpaperSupportsAmbientMode ? 0f : 1f;
}
@Override
@@ -369,7 +369,6 @@ public enum ScrimState {
DockManager mDockManager;
boolean mDisplayRequiresBlanking;
boolean mWallpaperSupportsAmbientMode;
- boolean mHasBackdrop;
boolean mLaunchingAffordanceWithPreview;
boolean mOccludeAnimationPlaying;
boolean mWakeLockScreenSensorActive;
@@ -489,10 +488,6 @@ public enum ScrimState {
return false;
}
- public void setHasBackdrop(boolean hasBackdrop) {
- mHasBackdrop = hasBackdrop;
- }
-
public void setWakeLockScreenSensorActive(boolean active) {
mWakeLockScreenSensorActive = active;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
index 17bd53869ee5..74c6e72d3400 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -47,7 +47,6 @@ import androidx.annotation.VisibleForTesting;
import com.android.internal.util.LatencyTracker;
import com.android.internal.widget.LockPatternUtils;
-import com.android.keyguard.AuthKeyguardMessageArea;
import com.android.keyguard.KeyguardMessageAreaController;
import com.android.keyguard.KeyguardSecurityModel;
import com.android.keyguard.KeyguardUpdateMonitor;
@@ -68,7 +67,6 @@ import com.android.systemui.bouncer.util.BouncerTestUtilsKt;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor;
-import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor;
import com.android.systemui.dock.DockManager;
import com.android.systemui.dreams.DreamOverlayStateController;
import com.android.systemui.keyguard.DismissCallbackRegistry;
@@ -77,9 +75,7 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardDismissActionInte
import com.android.systemui.keyguard.domain.interactor.KeyguardDismissTransitionInteractor;
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor;
import com.android.systemui.keyguard.shared.model.DismissAction;
-import com.android.systemui.keyguard.shared.model.Edge;
import com.android.systemui.keyguard.shared.model.KeyguardDone;
-import com.android.systemui.keyguard.shared.model.KeyguardState;
import com.android.systemui.keyguard.shared.model.TransitionStep;
import com.android.systemui.navigationbar.NavigationModeController;
import com.android.systemui.navigationbar.TaskbarDelegate;
@@ -165,7 +161,6 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
private final DreamOverlayStateController mDreamOverlayStateController;
@Nullable
private final FoldAodAnimationController mFoldAodAnimationController;
- KeyguardMessageAreaController<AuthKeyguardMessageArea> mKeyguardMessageAreaController;
private final PrimaryBouncerCallbackInteractor mPrimaryBouncerCallbackInteractor;
private final PrimaryBouncerInteractor mPrimaryBouncerInteractor;
private final AlternateBouncerInteractor mAlternateBouncerInteractor;
@@ -463,11 +458,6 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
onPanelExpansionChanged(currentState);
}
mNotificationContainer = notificationContainer;
- if (!DeviceEntryUdfpsRefactor.isEnabled()) {
- mKeyguardMessageAreaController = mKeyguardMessageAreaFactory.create(
- centralSurfaces.getKeyguardMessageArea());
- }
-
mCentralSurfacesRegistered = true;
registerListeners();
@@ -518,24 +508,11 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
mListenForCanShowAlternateBouncer.cancel(null);
}
mListenForCanShowAlternateBouncer = null;
- if (!DeviceEntryUdfpsRefactor.isEnabled()) {
- mListenForAlternateBouncerTransitionSteps = mJavaAdapter.alwaysCollectFlow(
- mKeyguardTransitionInteractor
- .transition(Edge.create(KeyguardState.ALTERNATE_BOUNCER)),
- this::consumeFromAlternateBouncerTransitionSteps
- );
-
- mListenForKeyguardAuthenticatedBiometricsHandled = mJavaAdapter.alwaysCollectFlow(
- mPrimaryBouncerInteractor.getKeyguardAuthenticatedBiometricsHandled(),
- this::consumeKeyguardAuthenticatedBiometricsHandled
- );
- } else {
- // Collector that keeps the AlternateBouncerInteractor#canShowAlternateBouncer flow hot.
- mListenForCanShowAlternateBouncer = mJavaAdapter.alwaysCollectFlow(
- mAlternateBouncerInteractor.getCanShowAlternateBouncer(),
- this::consumeCanShowAlternateBouncer
- );
- }
+ // Collector that keeps the AlternateBouncerInteractor#canShowAlternateBouncer flow hot.
+ mListenForCanShowAlternateBouncer = mJavaAdapter.alwaysCollectFlow(
+ mAlternateBouncerInteractor.getCanShowAlternateBouncer(),
+ this::consumeCanShowAlternateBouncer
+ );
if (KeyguardWmStateRefactor.isEnabled()) {
// Show the keyguard views whenever we've told WM that the lockscreen is visible.
@@ -792,21 +769,12 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
return;
}
- if (DeviceEntryUdfpsRefactor.isEnabled()) {
- if (mAlternateBouncerInteractor.canShowAlternateBouncerForFingerprint()) {
- Log.d(TAG, "showBouncer:alternateBouncer.forceShow()");
- mAlternateBouncerInteractor.forceShow();
- updateAlternateBouncerShowing(mAlternateBouncerInteractor.isVisibleState());
- } else {
- showPrimaryBouncer(scrimmed);
- }
- return;
- }
-
- if (!mAlternateBouncerInteractor.show()) {
- showPrimaryBouncer(scrimmed);
- } else {
+ if (mAlternateBouncerInteractor.canShowAlternateBouncerForFingerprint()) {
+ Log.d(TAG, "showBouncer:alternateBouncer.forceShow()");
+ mAlternateBouncerInteractor.forceShow();
updateAlternateBouncerShowing(mAlternateBouncerInteractor.isVisibleState());
+ } else {
+ showPrimaryBouncer(scrimmed);
}
}
@@ -921,13 +889,9 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
mKeyguardGoneCancelAction = null;
}
- if (DeviceEntryUdfpsRefactor.isEnabled()) {
- Log.d(TAG, "dismissWithAction:alternateBouncer.forceShow()");
- mAlternateBouncerInteractor.forceShow();
- updateAlternateBouncerShowing(mAlternateBouncerInteractor.isVisibleState());
- } else {
- updateAlternateBouncerShowing(mAlternateBouncerInteractor.show());
- }
+ Log.d(TAG, "dismissWithAction:alternateBouncer.forceShow()");
+ mAlternateBouncerInteractor.forceShow();
+ updateAlternateBouncerShowing(mAlternateBouncerInteractor.isVisibleState());
setKeyguardMessage(message, null, null);
return;
}
@@ -1033,11 +997,6 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
}
final boolean isShowingAlternateBouncer = mAlternateBouncerInteractor.isVisibleState();
- if (mKeyguardMessageAreaController != null) {
- DeviceEntryUdfpsRefactor.assertInLegacyMode();
- mKeyguardMessageAreaController.setIsVisible(isShowingAlternateBouncer);
- mKeyguardMessageAreaController.setMessage("");
- }
if (!SceneContainerFlag.isEnabled()) {
mKeyguardUpdateManager.setAlternateBouncerShowing(isShowingAlternateBouncer);
}
@@ -1646,12 +1605,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
/** Display security message to relevant KeyguardMessageArea. */
public void setKeyguardMessage(String message, ColorStateList colorState,
BiometricSourceType biometricSourceType) {
- if (mAlternateBouncerInteractor.isVisibleState()) {
- if (mKeyguardMessageAreaController != null) {
- DeviceEntryUdfpsRefactor.assertInLegacyMode();
- mKeyguardMessageAreaController.setMessage(message, biometricSourceType);
- }
- } else {
+ if (!mAlternateBouncerInteractor.isVisibleState()) {
mPrimaryBouncerInteractor.showMessage(message, colorState);
}
}
@@ -1778,66 +1732,6 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
}
}
- /**
- * An opportunity for the AlternateBouncer to handle the touch instead of sending
- * the touch to NPVC child views.
- * @return true if the alternate bouncer should consime the touch and prevent it from
- * going to its child views
- */
- public boolean dispatchTouchEvent(MotionEvent event) {
- if (shouldInterceptTouchEvent(event)
- && !mUdfpsOverlayInteractor.isTouchWithinUdfpsArea(event)) {
- onTouch(event);
- }
- return shouldInterceptTouchEvent(event);
- }
-
- /**
- * Whether the touch should be intercepted by the AlternateBouncer before going to the
- * notification shade's child views.
- */
- public boolean shouldInterceptTouchEvent(MotionEvent event) {
- if (DeviceEntryUdfpsRefactor.isEnabled()) {
- return false;
- }
- return mAlternateBouncerInteractor.isVisibleState();
- }
-
- /**
- * For any touches on the NPVC, show the primary bouncer if the alternate bouncer is currently
- * showing.
- */
- public boolean onTouch(MotionEvent event) {
- if (DeviceEntryUdfpsRefactor.isEnabled()) {
- return false;
- }
-
- boolean handleTouch = shouldInterceptTouchEvent(event);
- if (handleTouch) {
- final boolean actionDown = event.getActionMasked() == MotionEvent.ACTION_DOWN;
- final boolean actionDownThenUp = mAlternateBouncerInteractor.getReceivedDownTouch()
- && event.getActionMasked() == MotionEvent.ACTION_UP;
- final boolean udfpsOverlayWillForwardEventsOutsideNotificationShade =
- mKeyguardUpdateManager.isUdfpsEnrolled();
- final boolean actionOutsideShouldDismissAlternateBouncer =
- event.getActionMasked() == MotionEvent.ACTION_OUTSIDE
- && !udfpsOverlayWillForwardEventsOutsideNotificationShade;
- if (actionDown) {
- mAlternateBouncerInteractor.setReceivedDownTouch(true);
- } else if ((actionDownThenUp || actionOutsideShouldDismissAlternateBouncer)
- && mAlternateBouncerInteractor.hasAlternateBouncerShownWithMinTime()) {
- showPrimaryBouncer(true);
- }
- }
-
- // Forward NPVC touches to callbacks in case they want to respond to touches
- for (KeyguardViewManagerCallback callback: mCallbacks) {
- callback.onTouch(event);
- }
-
- return handleTouch;
- }
-
/** Update keyguard position based on a tapped X coordinate. */
public void updateKeyguardPosition(float x) {
mPrimaryBouncerInteractor.setKeyguardPosition(x);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconsViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconsViewModel.kt
index bad6f80c3735..694a5e529ec4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconsViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconsViewModel.kt
@@ -16,8 +16,8 @@
package com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel
-import com.android.app.tracing.coroutines.createCoroutineTracingContext
import androidx.annotation.VisibleForTesting
+import com.android.systemui.coroutines.newTracingContext
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.flags.FeatureFlagsClassic
@@ -29,8 +29,8 @@ import com.android.systemui.statusbar.pipeline.mobile.ui.VerboseMobileViewLogger
import com.android.systemui.statusbar.pipeline.mobile.ui.view.ModernStatusBarMobileView
import com.android.systemui.statusbar.pipeline.shared.ConnectivityConstants
import javax.inject.Inject
-import kotlinx.coroutines.CoroutineScope
import kotlin.coroutines.CoroutineContext
+import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.Job
import kotlinx.coroutines.cancel
@@ -116,7 +116,7 @@ constructor(
private fun createViewModel(subId: Int): Pair<MobileIconViewModel, CoroutineScope> {
// Create a child scope so we can cancel it
- val vmScope = scope.createChildScope(createCoroutineTracingContext("MobileIconViewModel"))
+ val vmScope = scope.createChildScope(newTracingContext("MobileIconViewModel"))
val vm =
MobileIconViewModel(
subId,
diff --git a/packages/SystemUI/src/com/android/systemui/util/drawable/DrawableSize.kt b/packages/SystemUI/src/com/android/systemui/util/drawable/DrawableSize.kt
index de9231856e2c..d87607dec8a1 100644
--- a/packages/SystemUI/src/com/android/systemui/util/drawable/DrawableSize.kt
+++ b/packages/SystemUI/src/com/android/systemui/util/drawable/DrawableSize.kt
@@ -11,6 +11,7 @@ import android.graphics.drawable.AnimatedStateListDrawable
import android.graphics.drawable.AnimatedVectorDrawable
import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.Drawable
+import android.graphics.drawable.LayerDrawable
import android.util.Log
import androidx.annotation.Px
import com.android.app.tracing.traceSection
@@ -22,36 +23,35 @@ class DrawableSize {
const val TAG = "SysUiDrawableSize"
/**
- * Downscales passed Drawable to set maximum width and height. This will only
- * be done for Drawables that can be downscaled non-destructively - e.g. animated
- * and stateful drawables will no be downscaled.
+ * Downscales passed Drawable to set maximum width and height. This will only be done for
+ * Drawables that can be downscaled non-destructively - e.g. animated drawables, stateful
+ * drawables, and drawables with mixed-type layers will not be downscaled.
*
- * Downscaling will keep the aspect ratio.
- * This method will not touch drawables that already fit into size specification.
+ * Downscaling will keep the aspect ratio. This method will not touch drawables that already
+ * fit into size specification.
*
* @param resources Resources on which to base the density of resized drawable.
* @param drawable Drawable to downscale.
* @param maxWidth Maximum width of the downscaled drawable.
* @param maxHeight Maximum height of the downscaled drawable.
- *
* @return returns downscaled drawable if it's possible to downscale it or original if it's
- * not.
+ * not.
*/
@JvmStatic
fun downscaleToSize(
res: Resources,
drawable: Drawable,
@Px maxWidth: Int,
- @Px maxHeight: Int
+ @Px maxHeight: Int,
): Drawable {
traceSection("DrawableSize#downscaleToSize") {
// Bitmap drawables can contain big bitmaps as their content while sneaking it past
// us using density scaling. Inspect inside the Bitmap drawables for actual bitmap
// size for those.
- val originalWidth = (drawable as? BitmapDrawable)?.bitmap?.width
- ?: drawable.intrinsicWidth
- val originalHeight = (drawable as? BitmapDrawable)?.bitmap?.height
- ?: drawable.intrinsicHeight
+ val originalWidth =
+ (drawable as? BitmapDrawable)?.bitmap?.width ?: drawable.intrinsicWidth
+ val originalHeight =
+ (drawable as? BitmapDrawable)?.bitmap?.height ?: drawable.intrinsicHeight
// Don't touch drawable if we can't resolve sizes for whatever reason.
if (originalWidth <= 0 || originalHeight <= 0) {
@@ -61,14 +61,18 @@ class DrawableSize {
// Do not touch drawables that are already within bounds.
if (originalWidth < maxWidth && originalHeight < maxHeight) {
if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG, "Not resizing $originalWidth x $originalHeight" + " " +
- "to $maxWidth x $maxHeight")
+ Log.d(
+ TAG,
+ "Not resizing $originalWidth x $originalHeight" +
+ " " +
+ "to $maxWidth x $maxHeight",
+ )
}
return drawable
}
- if (!isSimpleBitmap(drawable)) {
+ if (isComplicatedBitmap(drawable)) {
return drawable
}
@@ -80,19 +84,25 @@ class DrawableSize {
val height = (originalHeight * scale).toInt()
if (width <= 0 || height <= 0) {
- Log.w(TAG, "Attempted to resize ${drawable.javaClass.simpleName} " +
- "from $originalWidth x $originalHeight to invalid $width x $height.")
+ Log.w(
+ TAG,
+ "Attempted to resize ${drawable.javaClass.simpleName} " +
+ "from $originalWidth x $originalHeight to invalid $width x $height.",
+ )
return drawable
}
if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG, "Resizing large drawable (${drawable.javaClass.simpleName}) " +
- "from $originalWidth x $originalHeight to $width x $height")
+ Log.d(
+ TAG,
+ "Resizing large drawable (${drawable.javaClass.simpleName}) " +
+ "from $originalWidth x $originalHeight to $width x $height",
+ )
}
// We want to keep existing config if it's more efficient than 32-bit RGB.
- val config = (drawable as? BitmapDrawable)?.bitmap?.config
- ?: Bitmap.Config.ARGB_8888
+ val config =
+ (drawable as? BitmapDrawable)?.bitmap?.config ?: Bitmap.Config.ARGB_8888
val scaledDrawableBitmap = Bitmap.createBitmap(width, height, config)
val canvas = Canvas(scaledDrawableBitmap)
@@ -105,8 +115,8 @@ class DrawableSize {
}
}
- private fun isSimpleBitmap(drawable: Drawable): Boolean {
- return !(drawable.isStateful || isAnimated(drawable))
+ private fun isComplicatedBitmap(drawable: Drawable): Boolean {
+ return drawable.isStateful || isAnimated(drawable) || hasComplicatedLayers(drawable)
}
private fun isAnimated(drawable: Drawable): Boolean {
@@ -119,5 +129,30 @@ class DrawableSize {
drawable is AnimatedStateListDrawable ||
drawable is AnimatedVectorDrawable
}
+
+ private fun hasComplicatedLayers(drawable: Drawable): Boolean {
+ if (drawable !is LayerDrawable) {
+ return false
+ }
+ if (drawable.numberOfLayers == 1) {
+ return false
+ }
+
+ val firstLayerType = drawable.getDrawable(0).javaClass
+ for (i in 1..<drawable.numberOfLayers) {
+ val layer = drawable.getDrawable(i)
+ if (layer.javaClass != firstLayerType) {
+ // If different layers have different drawable types, we shouldn't scale it down
+ // because we may lose the level information if one of the layers is a bitmap
+ // and another layer is a level-list. See b/244282477.
+ return true
+ }
+ if (isComplicatedBitmap(layer)) {
+ return true
+ }
+ }
+
+ return false
+ }
}
-} \ No newline at end of file
+}
diff --git a/packages/SystemUI/src/com/android/systemui/util/kotlin/GlobalCoroutinesModule.kt b/packages/SystemUI/src/com/android/systemui/util/kotlin/GlobalCoroutinesModule.kt
index 2af84c7e46f0..579af73236f3 100644
--- a/packages/SystemUI/src/com/android/systemui/util/kotlin/GlobalCoroutinesModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/util/kotlin/GlobalCoroutinesModule.kt
@@ -16,10 +16,9 @@
package com.android.systemui.util.kotlin
-import com.android.app.tracing.coroutines.createCoroutineTracingContext
+import com.android.systemui.coroutines.newTracingContext
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.Main
-import com.android.systemui.dagger.qualifiers.Tracing
import dagger.Module
import dagger.Provides
import javax.inject.Singleton
@@ -27,7 +26,6 @@ import kotlin.coroutines.CoroutineContext
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.ExperimentalCoroutinesApi
/** Providers for various application-wide coroutines-related constructs. */
@Module
@@ -35,16 +33,15 @@ class GlobalCoroutinesModule {
@Provides
@Singleton
@Application
- fun applicationScope(
- @Main dispatcherContext: CoroutineContext,
- ): CoroutineScope = CoroutineScope(dispatcherContext + createCoroutineTracingContext("ApplicationScope"))
+ fun applicationScope(@Main dispatcherContext: CoroutineContext): CoroutineScope =
+ CoroutineScope(dispatcherContext + newTracingContext("ApplicationScope"))
@Provides
@Singleton
@Main
@Deprecated(
"Use @Main CoroutineContext instead",
- ReplaceWith("mainCoroutineContext()", "kotlin.coroutines.CoroutineContext")
+ ReplaceWith("mainCoroutineContext()", "kotlin.coroutines.CoroutineContext"),
)
fun mainDispatcher(): CoroutineDispatcher = Dispatchers.Main.immediate
diff --git a/packages/SystemUI/src/com/android/systemui/util/settings/SettingsProxy.kt b/packages/SystemUI/src/com/android/systemui/util/settings/SettingsProxy.kt
index 4d9aaa6dc6b0..ea8709f7d65c 100644
--- a/packages/SystemUI/src/com/android/systemui/util/settings/SettingsProxy.kt
+++ b/packages/SystemUI/src/com/android/systemui/util/settings/SettingsProxy.kt
@@ -15,7 +15,6 @@
*/
package com.android.systemui.util.settings
-import com.android.app.tracing.coroutines.createCoroutineTracingContext
import android.annotation.UserIdInt
import android.content.ContentResolver
import android.database.ContentObserver
@@ -24,6 +23,7 @@ import android.provider.Settings.SettingNotFoundException
import androidx.annotation.AnyThread
import androidx.annotation.WorkerThread
import com.android.app.tracing.TraceUtils.trace
+import com.android.systemui.coroutines.newTracingContext
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
@@ -94,7 +94,7 @@ interface SettingsProxy {
*/
@AnyThread
fun registerContentObserverAsync(name: String, settingsObserver: ContentObserver) =
- CoroutineScope(backgroundDispatcher + createCoroutineTracingContext("SettingsProxy-A")).launch {
+ CoroutineScope(backgroundDispatcher + newTracingContext("SettingsProxy-A")).launch {
registerContentObserverSync(getUriFor(name), settingsObserver)
}
@@ -109,9 +109,9 @@ interface SettingsProxy {
fun registerContentObserverAsync(
name: String,
settingsObserver: ContentObserver,
- @WorkerThread registered: Runnable
+ @WorkerThread registered: Runnable,
) =
- CoroutineScope(backgroundDispatcher + createCoroutineTracingContext("SettingsProxy-B")).launch {
+ CoroutineScope(backgroundDispatcher + newTracingContext("SettingsProxy-B")).launch {
registerContentObserverSync(getUriFor(name), settingsObserver)
registered.run()
}
@@ -144,7 +144,7 @@ interface SettingsProxy {
*/
@AnyThread
fun registerContentObserverAsync(uri: Uri, settingsObserver: ContentObserver) =
- CoroutineScope(backgroundDispatcher + createCoroutineTracingContext("SettingsProxy-C")).launch {
+ CoroutineScope(backgroundDispatcher + newTracingContext("SettingsProxy-C")).launch {
registerContentObserverSync(uri, settingsObserver)
}
@@ -159,9 +159,9 @@ interface SettingsProxy {
fun registerContentObserverAsync(
uri: Uri,
settingsObserver: ContentObserver,
- @WorkerThread registered: Runnable
+ @WorkerThread registered: Runnable,
) =
- CoroutineScope(backgroundDispatcher + createCoroutineTracingContext("SettingsProxy-D")).launch {
+ CoroutineScope(backgroundDispatcher + newTracingContext("SettingsProxy-D")).launch {
registerContentObserverSync(uri, settingsObserver)
registered.run()
}
@@ -175,7 +175,7 @@ interface SettingsProxy {
fun registerContentObserverSync(
name: String,
notifyForDescendants: Boolean,
- settingsObserver: ContentObserver
+ settingsObserver: ContentObserver,
) = registerContentObserverSync(getUriFor(name), notifyForDescendants, settingsObserver)
/**
@@ -204,9 +204,9 @@ interface SettingsProxy {
fun registerContentObserverAsync(
name: String,
notifyForDescendants: Boolean,
- settingsObserver: ContentObserver
+ settingsObserver: ContentObserver,
) =
- CoroutineScope(backgroundDispatcher + createCoroutineTracingContext("SettingsProxy-E")).launch {
+ CoroutineScope(backgroundDispatcher + newTracingContext("SettingsProxy-E")).launch {
registerContentObserverSync(getUriFor(name), notifyForDescendants, settingsObserver)
}
@@ -222,9 +222,9 @@ interface SettingsProxy {
name: String,
notifyForDescendants: Boolean,
settingsObserver: ContentObserver,
- @WorkerThread registered: Runnable
+ @WorkerThread registered: Runnable,
) =
- CoroutineScope(backgroundDispatcher + createCoroutineTracingContext("SettingsProxy-F")).launch {
+ CoroutineScope(backgroundDispatcher + newTracingContext("SettingsProxy-F")).launch {
registerContentObserverSync(getUriFor(name), notifyForDescendants, settingsObserver)
registered.run()
}
@@ -273,9 +273,9 @@ interface SettingsProxy {
fun registerContentObserverAsync(
uri: Uri,
notifyForDescendants: Boolean,
- settingsObserver: ContentObserver
+ settingsObserver: ContentObserver,
) =
- CoroutineScope(backgroundDispatcher + createCoroutineTracingContext("SettingsProxy-G")).launch {
+ CoroutineScope(backgroundDispatcher + newTracingContext("SettingsProxy-G")).launch {
registerContentObserverSync(uri, notifyForDescendants, settingsObserver)
}
@@ -291,9 +291,9 @@ interface SettingsProxy {
uri: Uri,
notifyForDescendants: Boolean,
settingsObserver: ContentObserver,
- @WorkerThread registered: Runnable
+ @WorkerThread registered: Runnable,
) =
- CoroutineScope(backgroundDispatcher + createCoroutineTracingContext("SettingsProxy-H")).launch {
+ CoroutineScope(backgroundDispatcher + newTracingContext("SettingsProxy-H")).launch {
registerContentObserverSync(uri, notifyForDescendants, settingsObserver)
registered.run()
}
@@ -330,7 +330,9 @@ interface SettingsProxy {
*/
@AnyThread
fun unregisterContentObserverAsync(settingsObserver: ContentObserver) =
- CoroutineScope(backgroundDispatcher + createCoroutineTracingContext("SettingsProxy-I")).launch { unregisterContentObserver(settingsObserver) }
+ CoroutineScope(backgroundDispatcher + newTracingContext("SettingsProxy-I")).launch {
+ unregisterContentObserver(settingsObserver)
+ }
/**
* Look up a name in the database.
diff --git a/packages/SystemUI/src/com/android/systemui/util/settings/UserSettingsProxy.kt b/packages/SystemUI/src/com/android/systemui/util/settings/UserSettingsProxy.kt
index c820c07b61b1..c5deca214e28 100644
--- a/packages/SystemUI/src/com/android/systemui/util/settings/UserSettingsProxy.kt
+++ b/packages/SystemUI/src/com/android/systemui/util/settings/UserSettingsProxy.kt
@@ -15,7 +15,6 @@
*/
package com.android.systemui.util.settings
-import com.android.app.tracing.coroutines.createCoroutineTracingContext
import android.annotation.UserIdInt
import android.annotation.WorkerThread
import android.content.ContentResolver
@@ -24,6 +23,7 @@ import android.net.Uri
import android.os.UserHandle
import android.provider.Settings.SettingNotFoundException
import com.android.app.tracing.TraceUtils.trace
+import com.android.systemui.coroutines.newTracingContext
import com.android.systemui.util.settings.SettingsProxy.Companion.parseFloat
import com.android.systemui.util.settings.SettingsProxy.Companion.parseFloatOrThrow
import com.android.systemui.util.settings.SettingsProxy.Companion.parseLongOrThrow
@@ -79,7 +79,7 @@ interface UserSettingsProxy : SettingsProxy {
}
override fun registerContentObserverAsync(uri: Uri, settingsObserver: ContentObserver) =
- CoroutineScope(backgroundDispatcher + createCoroutineTracingContext("UserSettingsProxy-A")).launch {
+ CoroutineScope(backgroundDispatcher + newTracingContext("UserSettingsProxy-A")).launch {
registerContentObserverForUserSync(uri, settingsObserver, userId)
}
@@ -88,7 +88,7 @@ interface UserSettingsProxy : SettingsProxy {
override fun registerContentObserverSync(
uri: Uri,
notifyForDescendants: Boolean,
- settingsObserver: ContentObserver
+ settingsObserver: ContentObserver,
) {
registerContentObserverForUserSync(uri, notifyForDescendants, settingsObserver, userId)
}
@@ -111,9 +111,9 @@ interface UserSettingsProxy : SettingsProxy {
override fun registerContentObserverAsync(
uri: Uri,
notifyForDescendants: Boolean,
- settingsObserver: ContentObserver
+ settingsObserver: ContentObserver,
) =
- CoroutineScope(backgroundDispatcher + createCoroutineTracingContext("UserSettingsProxy-B")).launch {
+ CoroutineScope(backgroundDispatcher + newTracingContext("UserSettingsProxy-B")).launch {
registerContentObserverForUserSync(uri, notifyForDescendants, settingsObserver, userId)
}
@@ -156,9 +156,9 @@ interface UserSettingsProxy : SettingsProxy {
fun registerContentObserverForUserAsync(
name: String,
settingsObserver: ContentObserver,
- userHandle: Int
+ userHandle: Int,
) =
- CoroutineScope(backgroundDispatcher + createCoroutineTracingContext("UserSettingsProxy-C")).launch {
+ CoroutineScope(backgroundDispatcher + newTracingContext("UserSettingsProxy-C")).launch {
registerContentObserverForUserSync(getUriFor(name), settingsObserver, userHandle)
}
@@ -197,9 +197,9 @@ interface UserSettingsProxy : SettingsProxy {
fun registerContentObserverForUserAsync(
uri: Uri,
settingsObserver: ContentObserver,
- userHandle: Int
+ userHandle: Int,
) =
- CoroutineScope(backgroundDispatcher + createCoroutineTracingContext("UserSettingsProxy-D")).launch {
+ CoroutineScope(backgroundDispatcher + newTracingContext("UserSettingsProxy-D")).launch {
registerContentObserverForUserSync(uri, settingsObserver, userHandle)
}
@@ -214,9 +214,9 @@ interface UserSettingsProxy : SettingsProxy {
uri: Uri,
settingsObserver: ContentObserver,
userHandle: Int,
- @WorkerThread registered: Runnable
+ @WorkerThread registered: Runnable,
) =
- CoroutineScope(backgroundDispatcher + createCoroutineTracingContext("UserSettingsProxy-E")).launch {
+ CoroutineScope(backgroundDispatcher + newTracingContext("UserSettingsProxy-E")).launch {
registerContentObserverForUserSync(uri, settingsObserver, userHandle)
registered.run()
}
@@ -273,14 +273,14 @@ interface UserSettingsProxy : SettingsProxy {
name: String,
notifyForDescendants: Boolean,
settingsObserver: ContentObserver,
- userHandle: Int
+ userHandle: Int,
) {
- CoroutineScope(backgroundDispatcher + createCoroutineTracingContext("UserSettingsProxy-F")).launch {
+ CoroutineScope(backgroundDispatcher + newTracingContext("UserSettingsProxy-F")).launch {
registerContentObserverForUserSync(
getUriFor(name),
notifyForDescendants,
settingsObserver,
- userHandle
+ userHandle,
)
}
}
@@ -337,14 +337,14 @@ interface UserSettingsProxy : SettingsProxy {
uri: Uri,
notifyForDescendants: Boolean,
settingsObserver: ContentObserver,
- userHandle: Int
+ userHandle: Int,
) =
- CoroutineScope(backgroundDispatcher + createCoroutineTracingContext("UserSettingsProxy-G")).launch {
+ CoroutineScope(backgroundDispatcher + newTracingContext("UserSettingsProxy-G")).launch {
registerContentObserverForUserSync(
uri,
notifyForDescendants,
settingsObserver,
- userHandle
+ userHandle,
)
}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/settings/domain/VolumeDialogSettingsButtonInteractor.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/settings/domain/VolumeDialogSettingsButtonInteractor.kt
index 2dd0bdab93d1..5e0af634c786 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/dialog/settings/domain/VolumeDialogSettingsButtonInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/settings/domain/VolumeDialogSettingsButtonInteractor.kt
@@ -17,7 +17,7 @@
package com.android.systemui.volume.dialog.settings.domain
import android.app.ActivityManager
-import com.android.app.tracing.coroutines.flow.map
+import com.android.app.tracing.coroutines.flow.flowName
import com.android.systemui.statusbar.policy.DeviceProvisionedController
import com.android.systemui.volume.Events
import com.android.systemui.volume.dialog.dagger.scope.VolumeDialog
@@ -30,6 +30,7 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.filterIsInstance
+import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn
@VolumeDialogScope
@@ -49,6 +50,7 @@ constructor(
deviceProvisionedController.isCurrentUserSetup() &&
model.lockTaskModeState == ActivityManager.LOCK_TASK_MODE_NONE
}
+ .flowName("VDSBI#isVisible")
.stateIn(coroutineScope, SharingStarted.Eagerly, false)
fun onButtonClicked() {
diff --git a/packages/SystemUI/res/layout/udfps_bp_view.xml b/packages/SystemUI/tests/res/drawable/layer_drawable_all_same_type.xml
index f1c55ef16cdc..d9ea0b91abdf 100644
--- a/packages/SystemUI/res/layout/udfps_bp_view.xml
+++ b/packages/SystemUI/tests/res/drawable/layer_drawable_all_same_type.xml
@@ -1,6 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2021 The Android Open Source Project
+<?xml version="1.0" encoding="utf-8"?><!--
+ ~ Copyright (C) 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.
@@ -14,9 +13,7 @@
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
-<com.android.systemui.biometrics.UdfpsBpView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/udfps_animation_view"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-</com.android.systemui.biometrics.UdfpsBpView>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
+ <item android:drawable="@drawable/ic_brightness"/>
+ <item android:drawable="@drawable/ic_brightness"/>
+</layer-list>
diff --git a/packages/SystemUI/tests/res/drawable/layer_drawable_different_types.xml b/packages/SystemUI/tests/res/drawable/layer_drawable_different_types.xml
new file mode 100644
index 000000000000..796de8f15f47
--- /dev/null
+++ b/packages/SystemUI/tests/res/drawable/layer_drawable_different_types.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ ~ Copyright (C) 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.
+ -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
+ <!-- dessert_flan is a PNG while ic_brightness is a level-list. -->
+ <item android:drawable="@drawable/dessert_flan"/>
+ <item android:drawable="@drawable/ic_brightness"/>
+</layer-list>
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt
index e2a6a5508992..4baca713e19f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt
@@ -16,21 +16,14 @@
package com.android.systemui.biometrics
-import android.graphics.Rect
import android.hardware.biometrics.BiometricRequestConstants.REASON_AUTH_BP
import android.hardware.biometrics.BiometricRequestConstants.REASON_AUTH_KEYGUARD
-import android.hardware.biometrics.BiometricRequestConstants.REASON_AUTH_OTHER
-import android.hardware.biometrics.BiometricRequestConstants.REASON_AUTH_SETTINGS
-import android.hardware.biometrics.BiometricRequestConstants.REASON_ENROLL_ENROLLING
import android.hardware.biometrics.BiometricRequestConstants.RequestReason
import android.hardware.fingerprint.IUdfpsOverlayControllerCallback
import android.testing.TestableLooper.RunWithLooper
import android.view.LayoutInflater
import android.view.MotionEvent
-import android.view.Surface
-import android.view.Surface.Rotation
import android.view.View
-import android.view.ViewGroup
import android.view.WindowManager
import android.view.accessibility.AccessibilityManager
import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -38,7 +31,6 @@ import androidx.test.filters.SmallTest
import com.android.app.viewcapture.ViewCapture
import com.android.app.viewcapture.ViewCaptureAwareWindowManager
import com.android.keyguard.KeyguardUpdateMonitor
-import com.android.systemui.Flags
import com.android.systemui.SysuiTestCase
import com.android.systemui.animation.ActivityTransitionAnimator
import com.android.systemui.biometrics.domain.interactor.UdfpsOverlayInteractor
@@ -61,9 +53,7 @@ import com.android.systemui.power.domain.interactor.PowerInteractor
import com.android.systemui.power.domain.interactor.powerInteractor
import com.android.systemui.power.shared.model.WakeSleepReason
import com.android.systemui.power.shared.model.WakefulnessState
-import com.android.systemui.res.R
import com.android.systemui.shade.domain.interactor.ShadeInteractor
-import com.android.systemui.statusbar.LockscreenShadeTransitionController
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager
import com.android.systemui.statusbar.phone.SystemUIDialogManager
import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController
@@ -86,7 +76,6 @@ import org.mockito.ArgumentMatchers.any
import org.mockito.ArgumentMatchers.eq
import org.mockito.Captor
import org.mockito.Mock
-import org.mockito.Mockito.mock
import org.mockito.Mockito.never
import org.mockito.Mockito.verify
import org.mockito.Mockito.`when` as whenever
@@ -118,7 +107,6 @@ class UdfpsControllerOverlayTest : SysuiTestCase() {
@Mock private lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor
@Mock private lateinit var dialogManager: SystemUIDialogManager
@Mock private lateinit var dumpManager: DumpManager
- @Mock private lateinit var transitionController: LockscreenShadeTransitionController
@Mock private lateinit var configurationController: ConfigurationController
@Mock private lateinit var keyguardStateController: KeyguardStateController
@Mock
@@ -126,8 +114,6 @@ class UdfpsControllerOverlayTest : SysuiTestCase() {
@Mock private lateinit var udfpsDisplayMode: UdfpsDisplayModeProvider
@Mock private lateinit var controllerCallback: IUdfpsOverlayControllerCallback
@Mock private lateinit var udfpsController: UdfpsController
- @Mock private lateinit var udfpsView: UdfpsView
- @Mock private lateinit var mUdfpsKeyguardViewLegacy: UdfpsKeyguardViewLegacy
@Mock private lateinit var mActivityTransitionAnimator: ActivityTransitionAnimator
@Mock private lateinit var primaryBouncerInteractor: PrimaryBouncerInteractor
@Mock private lateinit var alternateBouncerInteractor: AlternateBouncerInteractor
@@ -147,7 +133,7 @@ class UdfpsControllerOverlayTest : SysuiTestCase() {
private lateinit var powerInteractor: PowerInteractor
private lateinit var testScope: TestScope
- private val onTouch = { _: View, _: MotionEvent, _: Boolean -> true }
+ private val onTouch = { _: View, _: MotionEvent -> true }
private var overlayParams: UdfpsOverlayParams = UdfpsOverlayParams()
private lateinit var controllerOverlay: UdfpsControllerOverlay
@@ -158,53 +144,37 @@ class UdfpsControllerOverlayTest : SysuiTestCase() {
powerInteractor = kosmos.powerInteractor
keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository
keyguardTransitionInteractor = kosmos.keyguardTransitionInteractor
- whenever(inflater.inflate(R.layout.udfps_view, null, false)).thenReturn(udfpsView)
- whenever(inflater.inflate(R.layout.udfps_bp_view, null))
- .thenReturn(mock(UdfpsBpView::class.java))
- whenever(inflater.inflate(R.layout.udfps_keyguard_view_legacy, null))
- .thenReturn(mUdfpsKeyguardViewLegacy)
- whenever(inflater.inflate(R.layout.udfps_fpm_empty_view, null))
- .thenReturn(mock(UdfpsFpmEmptyView::class.java))
}
private suspend fun withReasonSuspend(
@RequestReason reason: Int,
isDebuggable: Boolean = false,
- enableDeviceEntryUdfpsRefactor: Boolean = false,
block: suspend () -> Unit,
) {
- withReason(
- reason,
- isDebuggable,
- enableDeviceEntryUdfpsRefactor,
- )
+ withReason(reason, isDebuggable)
block()
}
private fun withReason(
@RequestReason reason: Int,
isDebuggable: Boolean = false,
- enableDeviceEntryUdfpsRefactor: Boolean = false,
block: () -> Unit = {},
) {
- if (enableDeviceEntryUdfpsRefactor) {
- mSetFlagsRule.enableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
- } else {
- mSetFlagsRule.disableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
- }
controllerOverlay =
UdfpsControllerOverlay(
context,
inflater,
- ViewCaptureAwareWindowManager(windowManager, lazyViewCapture,
- isViewCaptureEnabled = false),
+ ViewCaptureAwareWindowManager(
+ windowManager,
+ lazyViewCapture,
+ isViewCaptureEnabled = false,
+ ),
accessibilityManager,
statusBarStateController,
statusBarKeyguardViewManager,
keyguardUpdateMonitor,
dialogManager,
dumpManager,
- transitionController,
configurationController,
keyguardStateController,
unlockedScreenOffAnimationController,
@@ -230,117 +200,6 @@ class UdfpsControllerOverlayTest : SysuiTestCase() {
block()
}
- @Test fun showUdfpsOverlay_bp() = withReason(REASON_AUTH_BP) { showUdfpsOverlay() }
-
- @Test
- fun showUdfpsOverlay_keyguard() =
- withReason(REASON_AUTH_KEYGUARD) {
- showUdfpsOverlay()
- verify(mUdfpsKeyguardViewLegacy).updateSensorLocation(eq(overlayParams.sensorBounds))
- }
-
- @Test fun showUdfpsOverlay_other() = withReason(REASON_AUTH_OTHER) { showUdfpsOverlay() }
-
- private fun withRotation(@Rotation rotation: Int, block: () -> Unit) {
- // Sensor that's in the top left corner of the display in natural orientation.
- val sensorBounds = Rect(0, 0, SENSOR_WIDTH, SENSOR_HEIGHT)
- val overlayBounds = Rect(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT)
- overlayParams =
- UdfpsOverlayParams(
- sensorBounds,
- overlayBounds,
- DISPLAY_WIDTH,
- DISPLAY_HEIGHT,
- scaleFactor = 1f,
- rotation
- )
- block()
- }
-
- @Test
- fun showUdfpsOverlay_withRotation0() =
- withRotation(Surface.ROTATION_0) {
- withReason(REASON_AUTH_BP) {
- controllerOverlay.show(udfpsController, overlayParams)
- verify(windowManager)
- .addView(eq(controllerOverlay.getTouchOverlay()), layoutParamsCaptor.capture())
-
- // ROTATION_0 is the native orientation. Sensor should stay in the top left corner.
- val lp = layoutParamsCaptor.value
- assertThat(lp.x).isEqualTo(0)
- assertThat(lp.y).isEqualTo(0)
- assertThat(lp.width).isEqualTo(DISPLAY_WIDTH)
- assertThat(lp.height).isEqualTo(DISPLAY_HEIGHT)
- }
- }
-
- @Test
- fun showUdfpsOverlay_withRotation180() =
- withRotation(Surface.ROTATION_180) {
- withReason(REASON_AUTH_BP) {
- controllerOverlay.show(udfpsController, overlayParams)
- verify(windowManager)
- .addView(eq(controllerOverlay.getTouchOverlay()), layoutParamsCaptor.capture())
-
- // ROTATION_180 is not supported. Sensor should stay in the top left corner.
- val lp = layoutParamsCaptor.value
- assertThat(lp.x).isEqualTo(0)
- assertThat(lp.y).isEqualTo(0)
- assertThat(lp.width).isEqualTo(DISPLAY_WIDTH)
- assertThat(lp.height).isEqualTo(DISPLAY_HEIGHT)
- }
- }
-
- @Test
- fun showUdfpsOverlay_withRotation90() =
- withRotation(Surface.ROTATION_90) {
- withReason(REASON_AUTH_BP) {
- controllerOverlay.show(udfpsController, overlayParams)
- verify(windowManager)
- .addView(eq(controllerOverlay.getTouchOverlay()), layoutParamsCaptor.capture())
-
- // Sensor should be in the bottom left corner in ROTATION_90.
- val lp = layoutParamsCaptor.value
- assertThat(lp.x).isEqualTo(0)
- assertThat(lp.y).isEqualTo(0)
- assertThat(lp.width).isEqualTo(DISPLAY_HEIGHT)
- assertThat(lp.height).isEqualTo(DISPLAY_WIDTH)
- }
- }
-
- @Test
- fun showUdfpsOverlay_withRotation270() =
- withRotation(Surface.ROTATION_270) {
- withReason(REASON_AUTH_BP) {
- controllerOverlay.show(udfpsController, overlayParams)
- verify(windowManager)
- .addView(eq(controllerOverlay.getTouchOverlay()), layoutParamsCaptor.capture())
-
- // Sensor should be in the top right corner in ROTATION_270.
- val lp = layoutParamsCaptor.value
- assertThat(lp.x).isEqualTo(0)
- assertThat(lp.y).isEqualTo(0)
- assertThat(lp.width).isEqualTo(DISPLAY_HEIGHT)
- assertThat(lp.height).isEqualTo(DISPLAY_WIDTH)
- }
- }
-
- @Test
- fun showUdfpsOverlay_awake() =
- testScope.runTest {
- withReason(REASON_AUTH_KEYGUARD) {
- powerRepository.updateWakefulness(
- rawState = WakefulnessState.AWAKE,
- lastWakeReason = WakeSleepReason.POWER_BUTTON,
- lastSleepReason = WakeSleepReason.OTHER,
- )
- runCurrent()
- controllerOverlay.show(udfpsController, overlayParams)
- runCurrent()
- verify(windowManager).addView(any(), any())
- }
- }
-
@Test
fun showUdfpsOverlay_whileGoingToSleep() =
testScope.runTest {
@@ -412,91 +271,9 @@ class UdfpsControllerOverlayTest : SysuiTestCase() {
}
@Test
- fun showUdfpsOverlay_afterFinishedTransitioningToAOD() =
- testScope.runTest {
- withReasonSuspend(REASON_AUTH_KEYGUARD) {
- keyguardTransitionRepository.sendTransitionSteps(
- from = KeyguardState.OFF,
- to = KeyguardState.GONE,
- testScope = this,
- )
- powerRepository.updateWakefulness(
- rawState = WakefulnessState.STARTING_TO_SLEEP,
- lastWakeReason = WakeSleepReason.POWER_BUTTON,
- lastSleepReason = WakeSleepReason.OTHER,
- )
- runCurrent()
-
- // WHEN a request comes to show the view
- controllerOverlay.show(udfpsController, overlayParams)
- runCurrent()
-
- // THEN the view does not get added immediately
- verify(windowManager, never()).addView(any(), any())
-
- // WHEN the device finishes transitioning to AOD
- keyguardTransitionRepository.sendTransitionSteps(
- from = KeyguardState.GONE,
- to = KeyguardState.AOD,
- testScope = this,
- )
- runCurrent()
-
- // THEN the view gets added
- verify(windowManager)
- .addView(eq(controllerOverlay.getTouchOverlay()), layoutParamsCaptor.capture())
- }
- }
-
- private fun showUdfpsOverlay() {
- val didShow = controllerOverlay.show(udfpsController, overlayParams)
-
- verify(windowManager).addView(eq(controllerOverlay.getTouchOverlay()), any())
- verify(udfpsView).setUdfpsDisplayModeProvider(eq(udfpsDisplayMode))
- verify(udfpsView).animationViewController = any()
- verify(udfpsView).addView(any())
-
- assertThat(didShow).isTrue()
- assertThat(controllerOverlay.isShowing).isTrue()
- assertThat(controllerOverlay.isHiding).isFalse()
- assertThat(controllerOverlay.getTouchOverlay()).isNotNull()
- }
-
- @Test fun hideUdfpsOverlay_bp() = withReason(REASON_AUTH_BP) { hideUdfpsOverlay() }
-
- @Test fun hideUdfpsOverlay_keyguard() = withReason(REASON_AUTH_KEYGUARD) { hideUdfpsOverlay() }
-
- @Test fun hideUdfpsOverlay_settings() = withReason(REASON_AUTH_SETTINGS) { hideUdfpsOverlay() }
-
- @Test fun hideUdfpsOverlay_other() = withReason(REASON_AUTH_OTHER) { hideUdfpsOverlay() }
-
- private fun hideUdfpsOverlay() {
- val didShow = controllerOverlay.show(udfpsController, overlayParams)
- val view = controllerOverlay.getTouchOverlay()
- view?.let { whenever(view.parent).thenReturn(mock(ViewGroup::class.java)) }
- val didHide = controllerOverlay.hide()
-
- verify(windowManager).removeView(eq(view))
-
- assertThat(didShow).isTrue()
- assertThat(didHide).isTrue()
- assertThat(controllerOverlay.getTouchOverlay()).isNull()
- assertThat(controllerOverlay.animationViewController).isNull()
- assertThat(controllerOverlay.isShowing).isFalse()
- assertThat(controllerOverlay.isHiding).isTrue()
- }
-
- @Test
fun canNotHide() = withReason(REASON_AUTH_BP) { assertThat(controllerOverlay.hide()).isFalse() }
@Test
- fun canNotReshow() =
- withReason(REASON_AUTH_BP) {
- assertThat(controllerOverlay.show(udfpsController, overlayParams)).isTrue()
- assertThat(controllerOverlay.show(udfpsController, overlayParams)).isFalse()
- }
-
- @Test
fun cancels() =
withReason(REASON_AUTH_BP) {
controllerOverlay.cancel()
@@ -504,16 +281,6 @@ class UdfpsControllerOverlayTest : SysuiTestCase() {
}
@Test
- fun unconfigureDisplayOnHide() =
- withReason(REASON_AUTH_BP) {
- whenever(udfpsView.isDisplayConfigured).thenReturn(true)
-
- controllerOverlay.show(udfpsController, overlayParams)
- controllerOverlay.hide()
- verify(udfpsView).unconfigureDisplay()
- }
-
- @Test
fun matchesRequestIds() =
withReason(REASON_AUTH_BP) {
assertThat(controllerOverlay.matchesRequestId(REQUEST_ID)).isTrue()
@@ -521,29 +288,9 @@ class UdfpsControllerOverlayTest : SysuiTestCase() {
}
@Test
- fun smallOverlayOnEnrollmentWithA11y() =
- withRotation(Surface.ROTATION_0) {
- withReason(REASON_ENROLL_ENROLLING) {
- // When a11y enabled during enrollment
- whenever(accessibilityManager.isTouchExplorationEnabled).thenReturn(true)
-
- controllerOverlay.show(udfpsController, overlayParams)
- verify(windowManager)
- .addView(eq(controllerOverlay.getTouchOverlay()), layoutParamsCaptor.capture())
-
- // Layout params should use sensor bounds
- val lp = layoutParamsCaptor.value
- assertThat(lp.width).isEqualTo(overlayParams.sensorBounds.width())
- assertThat(lp.height).isEqualTo(overlayParams.sensorBounds.height())
- }
- }
-
- @Test
fun addViewPending_layoutIsNotUpdated() =
testScope.runTest {
withReasonSuspend(REASON_AUTH_KEYGUARD) {
- mSetFlagsRule.enableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
-
// GIVEN going to sleep
keyguardTransitionRepository.sendTransitionSteps(
from = KeyguardState.OFF,
@@ -574,26 +321,4 @@ class UdfpsControllerOverlayTest : SysuiTestCase() {
controllerOverlay.hide()
}
}
-
- @Test
- fun updateOverlayParams_viewLayoutUpdated() =
- testScope.runTest {
- withReasonSuspend(REASON_AUTH_KEYGUARD) {
- powerRepository.updateWakefulness(
- rawState = WakefulnessState.AWAKE,
- lastWakeReason = WakeSleepReason.POWER_BUTTON,
- lastSleepReason = WakeSleepReason.OTHER,
- )
- runCurrent()
- controllerOverlay.show(udfpsController, overlayParams)
- runCurrent()
- verify(windowManager).addView(any(), any())
-
- // WHEN updateOverlayParams gets called
- controllerOverlay.updateOverlayParams(overlayParams)
-
- // THEN the view layout is updated
- verify(windowManager).updateViewLayout(any(), any())
- }
- }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
index e804b33db1f7..eecf36e9343b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
@@ -309,8 +309,6 @@ public class ScrimControllerTest extends SysuiTestCase {
// Attach behind scrim so flows that are collecting on it start running.
ViewUtils.attachView(mScrimBehind);
- mScrimController.setHasBackdrop(false);
-
mWallpaperRepository.getWallpaperSupportsAmbientMode().setValue(false);
mTestScope.getTestScheduler().runCurrent();
@@ -483,47 +481,6 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
- public void transitionToAod_withAodWallpaperAndLockScreenWallpaper() {
- mScrimController.setHasBackdrop(true);
- mWallpaperRepository.getWallpaperSupportsAmbientMode().setValue(true);
- mTestScope.getTestScheduler().runCurrent();
-
- mScrimController.legacyTransitionTo(ScrimState.AOD);
- finishAnimationsImmediately();
-
- assertScrimAlpha(Map.of(
- mScrimInFront, TRANSPARENT,
- mScrimBehind, TRANSPARENT));
- assertEquals(1f, mScrimController.getState().getMaxLightRevealScrimAlpha(), 0f);
-
- assertScrimTinted(Map.of(
- mScrimInFront, true,
- mScrimBehind, true
- ));
- }
-
- @Test
- public void setHasBackdrop_withAodWallpaperAndAlbumArt() {
- mWallpaperRepository.getWallpaperSupportsAmbientMode().setValue(true);
- mTestScope.getTestScheduler().runCurrent();
-
- mScrimController.legacyTransitionTo(ScrimState.AOD);
- finishAnimationsImmediately();
- mScrimController.setHasBackdrop(true);
- finishAnimationsImmediately();
-
- assertScrimAlpha(Map.of(
- mScrimInFront, TRANSPARENT,
- mScrimBehind, TRANSPARENT));
- assertEquals(1f, mScrimController.getState().getMaxLightRevealScrimAlpha(), 0f);
-
- assertScrimTinted(Map.of(
- mScrimInFront, true,
- mScrimBehind, true
- ));
- }
-
- @Test
public void transitionToAod_withFrontAlphaUpdates() {
// Assert that setting the AOD front scrim alpha doesn't take effect in a non-AOD state.
mScrimController.legacyTransitionTo(ScrimState.KEYGUARD);
@@ -1356,7 +1313,6 @@ public class ScrimControllerTest extends SysuiTestCase {
mScrimController.setScrimVisibleListener(visible -> mScrimVisibility = visible);
mScrimController.attachViews(mScrimBehind, mNotificationsScrim, mScrimInFront);
mScrimController.setAnimatorListener(mAnimatorListener);
- mScrimController.setHasBackdrop(false);
mWallpaperRepository.getWallpaperSupportsAmbientMode().setValue(false);
mTestScope.getTestScheduler().runCurrent();
mScrimController.legacyTransitionTo(ScrimState.KEYGUARD);
diff --git a/services/autofill/bugfixes.aconfig b/services/autofill/bugfixes.aconfig
index ba8448548365..1803424ae7d7 100644
--- a/services/autofill/bugfixes.aconfig
+++ b/services/autofill/bugfixes.aconfig
@@ -49,3 +49,10 @@ flag {
description: "Include the session id into the FillEventHistory events as part of ClientState"
bug: "333927465"
}
+
+flag {
+ name: "highlight_autofill_single_field"
+ namespace: "autofill"
+ description: "Highlight single field after autofill selection"
+ bug: "41496744"
+}
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index 2fa0e0d0d946..8f12b1db8f29 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -39,6 +39,7 @@ import static android.service.autofill.FillRequest.FLAG_SUPPORTS_FILL_DIALOG;
import static android.service.autofill.FillRequest.FLAG_VIEW_NOT_FOCUSED;
import static android.service.autofill.FillRequest.FLAG_VIEW_REQUESTS_CREDMAN_SERVICE;
import static android.service.autofill.FillRequest.INVALID_REQUEST_ID;
+import static android.service.autofill.Flags.highlightAutofillSingleField;
import static android.view.autofill.AutofillManager.ACTION_RESPONSE_EXPIRED;
import static android.view.autofill.AutofillManager.ACTION_START_SESSION;
import static android.view.autofill.AutofillManager.ACTION_VALUE_CHANGED;
@@ -49,7 +50,6 @@ import static android.view.autofill.AutofillManager.COMMIT_REASON_UNKNOWN;
import static android.view.autofill.AutofillManager.EXTRA_AUTOFILL_REQUEST_ID;
import static android.view.autofill.AutofillManager.FLAG_SMART_SUGGESTION_SYSTEM;
import static android.view.autofill.AutofillManager.getSmartSuggestionModeToString;
-
import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
import static com.android.server.autofill.FillRequestEventLogger.TRIGGER_REASON_EXPLICITLY_REQUESTED;
import static com.android.server.autofill.FillRequestEventLogger.TRIGGER_REASON_NORMAL_TRIGGER;
@@ -104,7 +104,6 @@ import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_STRUC
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.app.Activity;
import android.app.ActivityTaskManager;
import android.app.IAssistDataReceiver;
import android.app.PendingIntent;
@@ -143,7 +142,6 @@ import android.os.TransactionTooLargeException;
import android.service.assist.classification.FieldClassificationRequest;
import android.service.assist.classification.FieldClassificationResponse;
import android.service.autofill.AutofillFieldClassificationService.Scores;
-import android.service.autofill.AutofillService;
import android.service.autofill.CompositeUserData;
import android.service.autofill.ConvertCredentialResponse;
import android.service.autofill.Dataset;
@@ -186,7 +184,6 @@ import android.view.autofill.IAutoFillManagerClient;
import android.view.autofill.IAutofillWindowPresenter;
import android.view.inputmethod.InlineSuggestionsRequest;
import android.widget.RemoteViews;
-
import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.logging.MetricsLogger;
@@ -198,7 +195,6 @@ import com.android.server.autofill.ui.InlineFillUi;
import com.android.server.autofill.ui.PendingUi;
import com.android.server.inputmethod.InputMethodManagerInternal;
import com.android.server.wm.ActivityTaskManagerInternal;
-
import java.io.PrintWriter;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -222,18 +218,21 @@ import java.util.function.Function;
/**
* A session for a given activity.
*
- * <p>This class manages the multiple {@link ViewState}s for each view it has, and keeps track
- * of the current {@link ViewState} to display the appropriate UI.
+ * <p>This class manages the multiple {@link ViewState}s for each view it has, and keeps track of
+ * the current {@link ViewState} to display the appropriate UI.
*
- * <p>Although the autofill requests and callbacks are stateless from the service's point of
- * view, we need to keep state in the framework side for cases such as authentication. For
- * example, when service return a {@link FillResponse} that contains all the fields needed
- * to fill the activity but it requires authentication first, that response need to be held
- * until the user authenticates or it times out.
+ * <p>Although the autofill requests and callbacks are stateless from the service's point of view,
+ * we need to keep state in the framework side for cases such as authentication. For example, when
+ * service return a {@link FillResponse} that contains all the fields needed to fill the activity
+ * but it requires authentication first, that response need to be held until the user authenticates
+ * or it times out.
*/
-final class Session implements RemoteFillService.FillServiceCallbacks, ViewState.Listener,
- AutoFillUI.AutoFillUiCallback, ValueFinder,
- RemoteFieldClassificationService.FieldClassificationServiceCallbacks {
+final class Session
+ implements RemoteFillService.FillServiceCallbacks,
+ ViewState.Listener,
+ AutoFillUI.AutoFillUiCallback,
+ ValueFinder,
+ RemoteFieldClassificationService.FieldClassificationServiceCallbacks {
private static final String TAG = "AutofillSession";
// This should never be true in production. This is only for local debugging.
@@ -257,6 +256,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
private final AutofillManagerServiceImpl mService;
private final Handler mHandler;
private final AutoFillUI mUi;
+
/**
* Context associated with the session, it has the same {@link Context#getDisplayId() displayId}
* of the activity being autofilled.
@@ -286,14 +286,11 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
/** Session is destroyed and removed from the manager service. */
public static final int STATE_REMOVED = 3;
- @IntDef(prefix = { "STATE_" }, value = {
- STATE_UNKNOWN,
- STATE_ACTIVE,
- STATE_FINISHED,
- STATE_REMOVED
- })
+ @IntDef(
+ prefix = {"STATE_"},
+ value = {STATE_UNKNOWN, STATE_ACTIVE, STATE_FINISHED, STATE_REMOVED})
@Retention(RetentionPolicy.SOURCE)
- @interface SessionState{}
+ @interface SessionState {}
@GuardedBy("mLock")
private final SessionFlags mSessionFlags;
@@ -318,7 +315,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
public final int mFlags;
@GuardedBy("mLock")
- @NonNull private IBinder mActivityToken;
+ @NonNull
+ private IBinder mActivityToken;
/** The app activity that's being autofilled */
@NonNull private final ComponentName mComponentName;
@@ -341,11 +339,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
* autofill.
*/
@GuardedBy("mLock")
- @Nullable private Pair<Integer, InlineSuggestionsRequest> mLastInlineSuggestionsRequest;
+ @Nullable
+ private Pair<Integer, InlineSuggestionsRequest> mLastInlineSuggestionsRequest;
- /**
- * Id of the View currently being displayed.
- */
+ /** Id of the View currently being displayed. */
@GuardedBy("mLock")
private @Nullable AutofillId mCurrentViewId;
@@ -363,8 +360,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
*
* <p>Only {@code null} when the session is for augmented autofill only.
*/
- @Nullable
- private final RemoteFillService mRemoteFillService;
+ @Nullable private final RemoteFillService mRemoteFillService;
/**
* With the credman integration, Autofill Framework handles two types of autofill flows -
@@ -379,8 +375,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
* service the session was initially created with, the secondary provider handler will contain
* the remaining autofill service.
*/
- @Nullable
- private final SecondaryProviderHandler mSecondaryProviderHandler;
+ @Nullable private final SecondaryProviderHandler mSecondaryProviderHandler;
@GuardedBy("mLock")
private SparseArray<FillResponse> mResponses;
@@ -395,9 +390,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
@GuardedBy("mLock")
private ArrayList<FillContext> mContexts;
- /**
- * Whether the client has an {@link android.view.autofill.AutofillManager.AutofillCallback}.
- */
+ /** Whether the client has an {@link android.view.autofill.AutofillManager.AutofillCallback}. */
private boolean mHasCallback;
/** Whether the session has credential manager provider as the primary provider. */
@@ -426,32 +419,24 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
@GuardedBy("mLock")
private PendingUi mPendingSaveUi;
- /**
- * List of dataset ids selected by the user.
- */
+ /** List of dataset ids selected by the user. */
@GuardedBy("mLock")
private ArrayList<String> mSelectedDatasetIds;
- /**
- * When the session started (using elapsed time since boot).
- */
+ /** When the session started (using elapsed time since boot). */
private final long mStartTime;
- /**
- * Count of FillRequests in the session.
- */
+ /** Count of FillRequests in the session. */
private int mRequestCount;
/**
- * Starting timestamp of latency logger.
- * This is set when Session created or when the view is reset.
+ * Starting timestamp of latency logger. This is set when Session created or when the view is
+ * reset.
*/
@GuardedBy("mLock")
private long mLatencyBaseTime;
- /**
- * When the UI was shown for the first time (using elapsed time since boot).
- */
+ /** When the UI was shown for the first time (using elapsed time since boot). */
@GuardedBy("mLock")
private long mUiShownTime;
@@ -475,15 +460,11 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
@GuardedBy("mLock")
private final LocalLog mWtfHistory;
- /**
- * Map of {@link MetricsEvent#AUTOFILL_REQUEST} metrics, keyed by fill request id.
- */
+ /** Map of {@link MetricsEvent#AUTOFILL_REQUEST} metrics, keyed by fill request id. */
@GuardedBy("mLock")
private final SparseArray<LogMaker> mRequestLogs = new SparseArray<>(1);
- /**
- * Destroys the augmented Autofill UI.
- */
+ /** Destroys the augmented Autofill UI. */
// TODO(b/123099468): this runnable is called when the Autofill session is destroyed, the
// main reason being the cases where user tap HOME.
// Right now it's completely destroying the UI, but we need to decide whether / how to
@@ -494,13 +475,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
@Nullable
private Runnable mAugmentedAutofillDestroyer;
- /**
- * List of {@link MetricsEvent#AUTOFILL_AUGMENTED_REQUEST} metrics.
- */
+ /** List of {@link MetricsEvent#AUTOFILL_AUGMENTED_REQUEST} metrics. */
@GuardedBy("mLock")
private ArrayList<LogMaker> mAugmentedRequestsLogs;
-
/**
* List of autofill ids of autofillable fields present in the AssistStructure that can be used
* to trigger new augmented autofill requests (because the "standard" service was not interested
@@ -509,23 +487,17 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
@GuardedBy("mLock")
private ArrayList<AutofillId> mAugmentedAutofillableIds;
- @NonNull
- final AutofillInlineSessionController mInlineSessionController;
+ @NonNull final AutofillInlineSessionController mInlineSessionController;
- /**
- * Receiver of assist data from the app's {@link Activity}.
- */
+ /** Receiver of assist data from the app's {@link Activity}. */
private final AssistDataReceiverImpl mAssistReceiver = new AssistDataReceiverImpl();
- /**
- * Receiver of assist data for pcc purpose
- */
+ /** Receiver of assist data for pcc purpose */
private final PccAssistDataReceiverImpl mPccAssistReceiver = new PccAssistDataReceiverImpl();
private final ClassificationState mClassificationState = new ClassificationState();
- @Nullable
- private final ComponentName mCredentialAutofillService;
+ @Nullable private final ComponentName mCredentialAutofillService;
// TODO(b/216576510): Share one BroadcastReceiver between all Sessions instead of creating a
// new one per Session.
@@ -547,7 +519,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
Slog.v(TAG, "mDelayedFillBroadcastReceiver delayed fill action received");
synchronized (mLock) {
int requestId = intent.getIntExtra(EXTRA_REQUEST_ID, 0);
- FillResponse response = intent.getParcelableExtra(EXTRA_FILL_RESPONSE, android.service.autofill.FillResponse.class);
+ FillResponse response =
+ intent.getParcelableExtra(
+ EXTRA_FILL_RESPONSE,
+ android.service.autofill.FillResponse.class);
mFillRequestEventLogger.maybeSetRequestTriggerReason(
TRIGGER_REASON_RETRIGGER);
mAssistReceiver.processDelayedFillLocked(requestId, response);
@@ -575,28 +550,25 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
@GuardedBy("mLock")
private SessionCommittedEventLogger mSessionCommittedEventLogger;
- /**
- * Fill dialog request would likely be sent slightly later.
- */
+ /** Fill dialog request would likely be sent slightly later. */
@NonNull
@GuardedBy("mLock")
private boolean mPreviouslyFillDialogPotentiallyStarted;
/**
- * Keeps track of if the user entered view, this is used to
- * distinguish Fill Request that did not have user interaction
- * with ones that did.
+ * Keeps track of if the user entered view, this is used to distinguish Fill Request that did
+ * not have user interaction with ones that did.
*
- * This is set to true when entering view - after FillDialog FillRequest
- * or on plain user tap.
+ * <p>This is set to true when entering view - after FillDialog FillRequest or on plain user
+ * tap.
*/
@NonNull
@GuardedBy("mLock")
private boolean mLogViewEntered;
/**
- * Keeps the fill dialog trigger ids of the last response. This invalidates
- * the trigger ids of the previous response.
+ * Keeps the fill dialog trigger ids of the last response. This invalidates the trigger ids of
+ * the previous response.
*/
@Nullable
@GuardedBy("mLock")
@@ -662,9 +634,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
return false;
}
- /**
- * Collection of flags/booleans that helps determine Session behaviors.
- */
+ /** Collection of flags/booleans that helps determine Session behaviors. */
private final class SessionFlags {
/** Whether autofill is disabled by the service */
private boolean mAutofillDisabled;
@@ -695,31 +665,35 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
final class AssistDataReceiverImpl extends IAssistDataReceiver.Stub {
@GuardedBy("mLock")
private boolean mWaitForInlineRequest;
+
@GuardedBy("mLock")
private InlineSuggestionsRequest mPendingInlineSuggestionsRequest;
+
@GuardedBy("mLock")
private FillRequest mPendingFillRequest;
+
@GuardedBy("mLock")
private FillRequest mLastFillRequest;
- @Nullable Consumer<InlineSuggestionsRequest> newAutofillRequestLocked(ViewState viewState,
- boolean isInlineRequest) {
+ @Nullable
+ Consumer<InlineSuggestionsRequest> newAutofillRequestLocked(
+ ViewState viewState, boolean isInlineRequest) {
mPendingFillRequest = null;
mWaitForInlineRequest = isInlineRequest;
mPendingInlineSuggestionsRequest = null;
if (isInlineRequest) {
WeakReference<AssistDataReceiverImpl> assistDataReceiverWeakReference =
- new WeakReference<AssistDataReceiverImpl>(this);
+ new WeakReference<AssistDataReceiverImpl>(this);
WeakReference<ViewState> viewStateWeakReference =
- new WeakReference<ViewState>(viewState);
- return new InlineSuggestionRequestConsumer(assistDataReceiverWeakReference,
- viewStateWeakReference);
+ new WeakReference<ViewState>(viewState);
+ return new InlineSuggestionRequestConsumer(
+ assistDataReceiverWeakReference, viewStateWeakReference);
}
return null;
}
- void handleInlineSuggestionRequest(InlineSuggestionsRequest inlineSuggestionsRequest,
- ViewState viewState) {
+ void handleInlineSuggestionRequest(
+ InlineSuggestionsRequest inlineSuggestionsRequest, ViewState viewState) {
if (sVerbose) {
Slog.v(TAG, "handleInlineSuggestionRequest(): inline suggestion request received");
}
@@ -738,8 +712,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
void maybeRequestFillLocked() {
if (mPendingFillRequest == null) {
if (sVerbose) {
- Slog.v(TAG, "maybeRequestFillLocked(): cancelling calling fill request "
- + "due to empty pending fill request");
+ Slog.v(
+ TAG,
+ "maybeRequestFillLocked(): cancelling calling fill request "
+ + "due to empty pending fill request");
}
return;
}
@@ -748,27 +724,35 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
if (mWaitForInlineRequest) {
if (mPendingInlineSuggestionsRequest == null) {
if (sVerbose) {
- Slog.v(TAG, "maybeRequestFillLocked(): cancelling calling fill request "
- + "due to waiting for inline request and pending inline request is "
- + "currently empty");
+ Slog.v(
+ TAG,
+ "maybeRequestFillLocked(): cancelling calling fill request due to"
+ + " waiting for inline request and pending inline request is"
+ + " currently empty");
}
return;
}
if (sVerbose) {
- Slog.v(TAG, "maybeRequestFillLocked(): adding inline request to pending "
- + "fill request");
+ Slog.v(
+ TAG,
+ "maybeRequestFillLocked(): adding inline request to pending "
+ + "fill request");
}
- mPendingFillRequest = new FillRequest(mPendingFillRequest.getId(),
- mPendingFillRequest.getFillContexts(),
- mPendingFillRequest.getHints(),
- mPendingFillRequest.getClientState(),
- mPendingFillRequest.getFlags(),
- mPendingInlineSuggestionsRequest,
- mPendingFillRequest.getDelayedFillIntentSender());
+ mPendingFillRequest =
+ new FillRequest(
+ mPendingFillRequest.getId(),
+ mPendingFillRequest.getFillContexts(),
+ mPendingFillRequest.getHints(),
+ mPendingFillRequest.getClientState(),
+ mPendingFillRequest.getFlags(),
+ mPendingInlineSuggestionsRequest,
+ mPendingFillRequest.getDelayedFillIntentSender());
} else {
if (sVerbose) {
- Slog.v(TAG, "maybeRequestFillLocked(): not adding inline request to pending "
- + "fill request");
+ Slog.v(
+ TAG,
+ "maybeRequestFillLocked(): not adding inline request to pending "
+ + "fill request");
}
}
@@ -780,19 +764,19 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
&& mSecondaryProviderHandler != null) {
Slog.v(TAG, "Requesting fill response to secondary provider.");
if (!mIsPrimaryCredential) {
- mPendingFillRequest = addCredentialManagerDataToClientState(
- mPendingFillRequest,
- mPendingInlineSuggestionsRequest, id);
+ mPendingFillRequest =
+ addCredentialManagerDataToClientState(
+ mPendingFillRequest, mPendingInlineSuggestionsRequest, id);
}
- mSecondaryProviderHandler.onFillRequest(mPendingFillRequest,
- mPendingFillRequest.getFlags(), mClient.asBinder());
+ mSecondaryProviderHandler.onFillRequest(
+ mPendingFillRequest, mPendingFillRequest.getFlags(), mClient.asBinder());
} else if (mRemoteFillService != null) {
if (mIsPrimaryCredential) {
- mPendingFillRequest = addCredentialManagerDataToClientState(
- mPendingFillRequest,
- mPendingInlineSuggestionsRequest, id);
- mRemoteFillService.onFillCredentialRequest(mPendingFillRequest,
- mClient.asBinder());
+ mPendingFillRequest =
+ addCredentialManagerDataToClientState(
+ mPendingFillRequest, mPendingInlineSuggestionsRequest, id);
+ mRemoteFillService.onFillCredentialRequest(
+ mPendingFillRequest, mClient.asBinder());
} else {
mRemoteFillService.onFillRequest(mPendingFillRequest);
}
@@ -813,8 +797,11 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
@Override
public void onHandleAssistData(Bundle resultData) throws RemoteException {
if (mRemoteFillService == null) {
- wtf(null, "onHandleAssistData() called without a remote service. "
- + "mForAugmentedAutofillOnly: %s", mSessionFlags.mAugmentedAutofillOnly);
+ wtf(
+ null,
+ "onHandleAssistData() called without a remote service. "
+ + "mForAugmentedAutofillOnly: %s",
+ mSessionFlags.mAugmentedAutofillOnly);
return;
}
// Keeps to prevent it is cleared on multiple threads.
@@ -824,7 +811,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
return;
}
- final AssistStructure structure = resultData.getParcelable(ASSIST_KEY_STRUCTURE, android.app.assist.AssistStructure.class);
+ final AssistStructure structure =
+ resultData.getParcelable(
+ ASSIST_KEY_STRUCTURE, android.app.assist.AssistStructure.class);
if (structure == null) {
Slog.e(TAG, "No assist structure - app might have crashed providing it");
return;
@@ -852,13 +841,16 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
try {
structure.ensureDataForAutofill();
} catch (RuntimeException e) {
- wtf(e, "Exception lazy loading assist structure for %s: %s",
- structure.getActivityComponent(), e);
+ wtf(
+ e,
+ "Exception lazy loading assist structure for %s: %s",
+ structure.getActivityComponent(),
+ e);
return;
}
- final ArrayList<AutofillId> ids = Helper.getAutofillIds(structure,
- /* autofillableOnly= */false);
+ final ArrayList<AutofillId> ids =
+ Helper.getAutofillIds(structure, /* autofillableOnly= */ false);
for (int i = 0; i < ids.size(); i++) {
ids.get(i).setSessionId(Session.this.id);
}
@@ -868,8 +860,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
if (mCompatMode) {
// Sanitize URL bar, if needed
- final String[] urlBarIds = mService.getUrlBarResourceIdsForCompatMode(
- mComponentName.getPackageName());
+ final String[] urlBarIds =
+ mService.getUrlBarResourceIdsForCompatMode(
+ mComponentName.getPackageName());
if (sDebug) {
Slog.d(TAG, "url_bars in compat mode: " + Arrays.toString(urlBarIds));
}
@@ -878,11 +871,19 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
if (mUrlBar != null) {
final AutofillId urlBarId = mUrlBar.getAutofillId();
if (sDebug) {
- Slog.d(TAG, "Setting urlBar as id=" + urlBarId + " and domain "
- + mUrlBar.getWebDomain());
+ Slog.d(
+ TAG,
+ "Setting urlBar as id="
+ + urlBarId
+ + " and domain "
+ + mUrlBar.getWebDomain());
}
- final ViewState viewState = new ViewState(urlBarId, Session.this,
- ViewState.STATE_URL_BAR, mIsPrimaryCredential);
+ final ViewState viewState =
+ new ViewState(
+ urlBarId,
+ Session.this,
+ ViewState.STATE_URL_BAR,
+ mIsPrimaryCredential);
mViewStates.put(urlBarId, viewState);
}
}
@@ -907,11 +908,17 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
final List<String> hints = getTypeHintsForProvider();
mDelayedFillPendingIntent = createPendingIntent(requestId);
- request = new FillRequest(requestId, contexts, hints, mClientState, flags,
- /*inlineSuggestionsRequest=*/ null,
- /*delayedFillIntentSender=*/ mDelayedFillPendingIntent == null
- ? null
- : mDelayedFillPendingIntent.getIntentSender());
+ request =
+ new FillRequest(
+ requestId,
+ contexts,
+ hints,
+ mClientState,
+ flags,
+ /* inlineSuggestionsRequest= */ null,
+ /* delayedFillIntentSender= */ mDelayedFillPendingIntent == null
+ ? null
+ : mDelayedFillPendingIntent.getIntentSender());
mPendingFillRequest = request;
maybeRequestFillLocked();
@@ -930,39 +937,49 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
@GuardedBy("mLock")
void processDelayedFillLocked(int requestId, FillResponse response) {
if (mLastFillRequest != null && requestId == mLastFillRequest.getId()) {
- Slog.v(TAG, "processDelayedFillLocked: "
- + "calling onFillRequestSuccess with new response");
- onFillRequestSuccess(requestId, response,
- mService.getServicePackageName(), mLastFillRequest.getFlags());
+ Slog.v(
+ TAG,
+ "processDelayedFillLocked: "
+ + "calling onFillRequestSuccess with new response");
+ onFillRequestSuccess(
+ requestId,
+ response,
+ mService.getServicePackageName(),
+ mLastFillRequest.getFlags());
}
}
}
- private FillRequest addCredentialManagerDataToClientState(FillRequest pendingFillRequest,
- InlineSuggestionsRequest pendingInlineSuggestionsRequest, int sessionId) {
+ private FillRequest addCredentialManagerDataToClientState(
+ FillRequest pendingFillRequest,
+ InlineSuggestionsRequest pendingInlineSuggestionsRequest,
+ int sessionId) {
if (pendingFillRequest.getClientState() == null) {
- pendingFillRequest = new FillRequest(pendingFillRequest.getId(),
- pendingFillRequest.getFillContexts(),
- pendingFillRequest.getHints(),
- new Bundle(),
- pendingFillRequest.getFlags(),
- pendingInlineSuggestionsRequest,
- pendingFillRequest.getDelayedFillIntentSender());
+ pendingFillRequest =
+ new FillRequest(
+ pendingFillRequest.getId(),
+ pendingFillRequest.getFillContexts(),
+ pendingFillRequest.getHints(),
+ new Bundle(),
+ pendingFillRequest.getFlags(),
+ pendingInlineSuggestionsRequest,
+ pendingFillRequest.getDelayedFillIntentSender());
}
pendingFillRequest.getClientState().putInt(SESSION_ID_KEY, sessionId);
pendingFillRequest.getClientState().putInt(REQUEST_ID_KEY, pendingFillRequest.getId());
- ResultReceiver resultReceiver = constructCredentialManagerCallback(
- pendingFillRequest.getId());
- pendingFillRequest.getClientState().putParcelable(
- CredentialManager.EXTRA_AUTOFILL_RESULT_RECEIVER, resultReceiver);
+ ResultReceiver resultReceiver =
+ constructCredentialManagerCallback(pendingFillRequest.getId());
+ pendingFillRequest
+ .getClientState()
+ .putParcelable(CredentialManager.EXTRA_AUTOFILL_RESULT_RECEIVER, resultReceiver);
return pendingFillRequest;
}
/**
- * Get the list of valid autofill hint types from Device flags
- * Returns empty list if PCC is off or no types available
- */
+ * Get the list of valid autofill hint types from Device flags Returns empty list if PCC is off
+ * or no types available
+ */
private List<String> getTypeHintsForProvider() {
if (!mService.isPccClassificationEnabled()) {
return Collections.EMPTY_LIST;
@@ -978,9 +995,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
return List.of(typeHints.split(PCC_HINTS_DELIMITER));
}
- /**
- * Assist Data Receiver for PCC
- */
+ /** Assist Data Receiver for PCC */
private final class PccAssistDataReceiverImpl extends IAssistDataReceiver.Stub {
@GuardedBy("mLock")
@@ -998,7 +1013,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
new WeakReference<>(Session.this);
remoteFieldClassificationService.onFieldClassificationRequest(
mClassificationState.mPendingFieldClassificationRequest,
- fieldClassificationServiceCallbacksWeakRef);
+ fieldClassificationServiceCallbacksWeakRef);
}
mClassificationState.onFieldClassificationRequestSent();
}
@@ -1006,26 +1021,35 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
@Override
public void onHandleAssistData(Bundle resultData) throws RemoteException {
// TODO: add a check if pcc field classification service is present
- final AssistStructure structure = resultData.getParcelable(ASSIST_KEY_STRUCTURE,
- android.app.assist.AssistStructure.class);
+ final AssistStructure structure =
+ resultData.getParcelable(
+ ASSIST_KEY_STRUCTURE, android.app.assist.AssistStructure.class);
if (structure == null) {
- Slog.e(TAG, "No assist structure for pcc detection - "
- + "app might have crashed providing it");
+ Slog.e(
+ TAG,
+ "No assist structure for pcc detection - "
+ + "app might have crashed providing it");
return;
}
final Bundle receiverExtras = resultData.getBundle(ASSIST_KEY_RECEIVER_EXTRAS);
if (receiverExtras == null) {
- Slog.e(TAG, "No receiver extras for pcc detection - "
- + "app might have crashed providing it");
+ Slog.e(
+ TAG,
+ "No receiver extras for pcc detection - "
+ + "app might have crashed providing it");
return;
}
final int requestId = receiverExtras.getInt(EXTRA_REQUEST_ID);
if (sVerbose) {
- Slog.v(TAG, "New structure for PCC Detection: requestId " + requestId + ": "
- + structure);
+ Slog.v(
+ TAG,
+ "New structure for PCC Detection: requestId "
+ + requestId
+ + ": "
+ + structure);
}
synchronized (mLock) {
@@ -1037,13 +1061,16 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
try {
structure.ensureDataForAutofill();
} catch (RuntimeException e) {
- wtf(e, "Exception lazy loading assist structure for %s: %s",
- structure.getActivityComponent(), e);
+ wtf(
+ e,
+ "Exception lazy loading assist structure for %s: %s",
+ structure.getActivityComponent(),
+ e);
return;
}
- final ArrayList<AutofillId> ids = Helper.getAutofillIds(structure,
- /* autofillableOnly= */false);
+ final ArrayList<AutofillId> ids =
+ Helper.getAutofillIds(structure, /* autofillableOnly= */ false);
for (int i = 0; i < ids.size(); i++) {
ids.get(i).setSessionId(Session.this.id);
}
@@ -1066,13 +1093,18 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
PendingIntent pendingIntent;
final long identity = Binder.clearCallingIdentity();
try {
- Intent intent = new Intent(ACTION_DELAYED_FILL).setPackage("android")
- .putExtra(EXTRA_REQUEST_ID, requestId);
- pendingIntent = PendingIntent.getBroadcast(
- mContext, this.id, intent,
- PendingIntent.FLAG_MUTABLE
- | PendingIntent.FLAG_ONE_SHOT
- | PendingIntent.FLAG_CANCEL_CURRENT);
+ Intent intent =
+ new Intent(ACTION_DELAYED_FILL)
+ .setPackage("android")
+ .putExtra(EXTRA_REQUEST_ID, requestId);
+ pendingIntent =
+ PendingIntent.getBroadcast(
+ mContext,
+ this.id,
+ intent,
+ PendingIntent.FLAG_MUTABLE
+ | PendingIntent.FLAG_ONE_SHOT
+ | PendingIntent.FLAG_CANCEL_CURRENT);
} finally {
Binder.restoreCallingIdentity(identity);
}
@@ -1113,9 +1145,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
}
- /**
- * Returns the ids of all entries in {@link #mViewStates} in the same order.
- */
+ /** Returns the ids of all entries in {@link #mViewStates} in the same order. */
@GuardedBy("mLock")
private AutofillId[] getIdsOfAllViewStatesLocked() {
final int numViewState = mViewStates.size();
@@ -1164,8 +1194,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
/**
- * <p>Gets the value of a field, using either the {@code viewStates} or the {@code mContexts},
- * or {@code null} when not found on either of them.
+ * Gets the value of a field, using either the {@code viewStates} or the {@code mContexts}, or
+ * {@code null} when not found on either of them.
*/
@GuardedBy("mLock")
@Nullable
@@ -1180,16 +1210,22 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
final ArrayList<Session> previousSessions = mService.getPreviousSessionsLocked(this);
if (previousSessions != null) {
if (sDebug) {
- Slog.d(TAG, "findValueLocked(): looking on " + previousSessions.size()
- + " previous sessions for autofillId " + autofillId);
+ Slog.d(
+ TAG,
+ "findValueLocked(): looking on "
+ + previousSessions.size()
+ + " previous sessions for autofillId "
+ + autofillId);
}
for (int i = 0; i < previousSessions.size(); i++) {
final Session previousSession = previousSessions.get(i);
- final AutofillValue previousValue = previousSession
- .findValueFromThisSessionOnlyLocked(autofillId);
+ final AutofillValue previousValue =
+ previousSession.findValueFromThisSessionOnlyLocked(autofillId);
if (previousValue != null) {
- return getSanitizedValue(createSanitizers(previousSession.getSaveInfoLocked()),
- autofillId, previousValue);
+ return getSanitizedValue(
+ createSanitizers(previousSession.getSaveInfoLocked()),
+ autofillId,
+ previousValue);
}
}
}
@@ -1212,16 +1248,22 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
AutofillValue candidateSaveValue = state.getCandidateSaveValue();
if (candidateSaveValue != null && !candidateSaveValue.isEmpty()) {
if (sDebug) {
- Slog.d(TAG, "findValueLocked(): current value for " + autofillId
- + " is empty, using candidateSaveValue instead.");
+ Slog.d(
+ TAG,
+ "findValueLocked(): current value for "
+ + autofillId
+ + " is empty, using candidateSaveValue instead.");
}
return candidateSaveValue;
}
}
if (value == null) {
if (sDebug) {
- Slog.d(TAG, "findValueLocked(): no current value for " + autofillId
- + ", checking value from previous fill contexts");
+ Slog.d(
+ TAG,
+ "findValueLocked(): no current value for "
+ + autofillId
+ + ", checking value from previous fill contexts");
value = getValueFromContextsLocked(autofillId);
}
}
@@ -1231,17 +1273,16 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
/**
* Updates values of the nodes in the context's structure so that:
*
- * - proper node is focused
- * - autofillValue is sent back to service when it was previously autofilled
- * - autofillValue is sent in the view used to force a request
+ * <p>- proper node is focused - autofillValue is sent back to service when it was previously
+ * autofilled - autofillValue is sent in the view used to force a request
*
* @param fillContext The context to be filled
* @param flags The flags that started the session
*/
@GuardedBy("mLock")
private void fillContextWithAllowedValuesLocked(@NonNull FillContext fillContext, int flags) {
- final ViewNode[] nodes = fillContext
- .findViewNodesByAutofillIds(getIdsOfAllViewStatesLocked());
+ final ViewNode[] nodes =
+ fillContext.findViewNodesByAutofillIds(getIdsOfAllViewStatesLocked());
final int numViewState = mViewStates.size();
for (int i = 0; i < numViewState; i++) {
@@ -1250,7 +1291,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
final ViewNode node = nodes[i];
if (node == null) {
if (sVerbose) {
- Slog.v(TAG,
+ Slog.v(
+ TAG,
"fillContextWithAllowedValuesLocked(): no node for " + viewState.id);
}
continue;
@@ -1277,14 +1319,15 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
}
- /**
- * Cancels the last request sent to the {@link #mRemoteFillService}.
- */
+ /** Cancels the last request sent to the {@link #mRemoteFillService}. */
@GuardedBy("mLock")
private void cancelCurrentRequestLocked() {
if (mRemoteFillService == null) {
- wtf(null, "cancelCurrentRequestLocked() called without a remote service. "
- + "mForAugmentedAutofillOnly: %s", mSessionFlags.mAugmentedAutofillOnly);
+ wtf(
+ null,
+ "cancelCurrentRequestLocked() called without a remote service. "
+ + "mForAugmentedAutofillOnly: %s",
+ mSessionFlags.mAugmentedAutofillOnly);
return;
}
final int canceledRequest = mRemoteFillService.cancelCurrentRequest();
@@ -1318,21 +1361,20 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
private Optional<Integer> requestNewFillResponseLocked(
@NonNull ViewState viewState, int newState, int flags) {
boolean isSecondary = shouldRequestSecondaryProvider(flags);
- final FillResponse existingResponse = isSecondary
- ? viewState.getSecondaryResponse() : viewState.getResponse();
+ final FillResponse existingResponse =
+ isSecondary ? viewState.getSecondaryResponse() : viewState.getResponse();
mFillRequestEventLogger.startLogForNewRequest();
mRequestCount++;
mFillRequestEventLogger.maybeSetAppPackageUid(uid);
mFillRequestEventLogger.maybeSetFlags(mFlags);
- if(mPreviouslyFillDialogPotentiallyStarted) {
+ if (mPreviouslyFillDialogPotentiallyStarted) {
mFillRequestEventLogger.maybeSetRequestTriggerReason(TRIGGER_REASON_PRE_TRIGGER);
} else {
if ((flags & FLAG_MANUAL_REQUEST) != 0) {
mFillRequestEventLogger.maybeSetRequestTriggerReason(
TRIGGER_REASON_EXPLICITLY_REQUESTED);
} else {
- mFillRequestEventLogger.maybeSetRequestTriggerReason(
- TRIGGER_REASON_NORMAL_TRIGGER);
+ mFillRequestEventLogger.maybeSetRequestTriggerReason(TRIGGER_REASON_NORMAL_TRIGGER);
}
}
if (existingResponse != null) {
@@ -1348,9 +1390,14 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
mSessionState = STATE_ACTIVE;
if (mSessionFlags.mAugmentedAutofillOnly || mRemoteFillService == null) {
if (sVerbose) {
- Slog.v(TAG, "requestNewFillResponse(): triggering augmented autofill instead "
- + "(mForAugmentedAutofillOnly=" + mSessionFlags.mAugmentedAutofillOnly
- + ", flags=" + flags + ")");
+ Slog.v(
+ TAG,
+ "requestNewFillResponse(): triggering augmented autofill instead "
+ + "(mForAugmentedAutofillOnly="
+ + mSessionFlags.mAugmentedAutofillOnly
+ + ", flags="
+ + flags
+ + ")");
}
mSessionFlags.mAugmentedAutofillOnly = true;
mFillRequestEventLogger.maybeSetRequestId(AUGMENTED_AUTOFILL_REQUEST_ID);
@@ -1365,16 +1412,23 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
// Create a metrics log for the request
final int ordinal = mRequestLogs.size() + 1;
- final LogMaker log = newLogMaker(MetricsEvent.AUTOFILL_REQUEST)
- .addTaggedData(MetricsEvent.FIELD_AUTOFILL_REQUEST_ORDINAL, ordinal);
+ final LogMaker log =
+ newLogMaker(MetricsEvent.AUTOFILL_REQUEST)
+ .addTaggedData(MetricsEvent.FIELD_AUTOFILL_REQUEST_ORDINAL, ordinal);
if (flags != 0) {
log.addTaggedData(MetricsEvent.FIELD_AUTOFILL_FLAGS, flags);
}
mRequestLogs.put(requestId, log);
if (sVerbose) {
- Slog.v(TAG, "Requesting structure for request #" + ordinal + " ,requestId=" + requestId
- + ", flags=" + flags);
+ Slog.v(
+ TAG,
+ "Requesting structure for request #"
+ + ordinal
+ + " ,requestId="
+ + requestId
+ + ", flags="
+ + flags);
}
boolean isCredmanRequested = (flags & FLAG_VIEW_REQUESTS_CREDMAN_SERVICE) != 0;
mFillRequestEventLogger.maybeSetRequestId(requestId);
@@ -1406,11 +1460,12 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
// is also not focused.
final RemoteInlineSuggestionRenderService remoteRenderService =
mService.getRemoteInlineSuggestionRenderServiceLocked();
- if (mSessionFlags.mInlineSupportedByService && remoteRenderService != null
- && (isViewFocusedLocked(flags) || isRequestSupportFillDialog(flags))) {
+ if (mSessionFlags.mInlineSupportedByService
+ && remoteRenderService != null
+ && (isViewFocusedLocked(flags) || isRequestSupportFillDialog(flags))) {
Consumer<InlineSuggestionsRequest> inlineSuggestionsRequestConsumer =
- mAssistReceiver.newAutofillRequestLocked(viewState,
- /* isInlineRequest= */ true);
+ mAssistReceiver.newAutofillRequestLocked(
+ viewState, /* isInlineRequest= */ true);
if (inlineSuggestionsRequestConsumer != null) {
final int requestIdCopy = requestId;
final AutofillId focusedId = mCurrentViewId;
@@ -1423,8 +1478,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
requestIdCopy,
inlineSuggestionsRequestConsumer,
focusedId);
- RemoteCallback inlineSuggestionRendorInfoCallback = new RemoteCallback(
- inlineSuggestionRendorInfoCallbackOnResultListener, mHandler);
+ RemoteCallback inlineSuggestionRendorInfoCallback =
+ new RemoteCallback(
+ inlineSuggestionRendorInfoCallbackOnResultListener, mHandler);
remoteRenderService.getInlineSuggestionsRendererInfo(
inlineSuggestionRendorInfoCallback);
@@ -1465,8 +1521,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
receiverExtras.putInt(EXTRA_REQUEST_ID, requestId);
final long identity = Binder.clearCallingIdentity();
try {
- if (!ActivityTaskManager.getService().requestAutofillData(mPccAssistReceiver,
- receiverExtras, mActivityToken, flags)) {
+ if (!ActivityTaskManager.getService()
+ .requestAutofillData(
+ mPccAssistReceiver, receiverExtras, mActivityToken, flags)) {
Slog.w(TAG, "failed to request autofill data for " + mActivityToken);
}
} finally {
@@ -1483,8 +1540,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
receiverExtras.putInt(EXTRA_REQUEST_ID, requestId);
final long identity = Binder.clearCallingIdentity();
try {
- if (!ActivityTaskManager.getService().requestAutofillData(mAssistReceiver,
- receiverExtras, mActivityToken, flags)) {
+ if (!ActivityTaskManager.getService()
+ .requestAutofillData(
+ mAssistReceiver, receiverExtras, mActivityToken, flags)) {
Slog.w(TAG, "failed to request autofill data for " + mActivityToken);
}
} finally {
@@ -1495,13 +1553,27 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
}
- Session(@NonNull AutofillManagerServiceImpl service, @NonNull AutoFillUI ui,
- @NonNull Context context, @NonNull Handler handler, int userId, @NonNull Object lock,
- int sessionId, int taskId, int uid, @NonNull IBinder activityToken,
- @NonNull IBinder client, boolean hasCallback, @NonNull LocalLog uiLatencyHistory,
- @NonNull LocalLog wtfHistory, @Nullable ComponentName serviceComponentName,
- @NonNull ComponentName componentName, boolean compatMode,
- boolean bindInstantServiceAllowed, boolean forAugmentedAutofillOnly, int flags,
+ Session(
+ @NonNull AutofillManagerServiceImpl service,
+ @NonNull AutoFillUI ui,
+ @NonNull Context context,
+ @NonNull Handler handler,
+ int userId,
+ @NonNull Object lock,
+ int sessionId,
+ int taskId,
+ int uid,
+ @NonNull IBinder activityToken,
+ @NonNull IBinder client,
+ boolean hasCallback,
+ @NonNull LocalLog uiLatencyHistory,
+ @NonNull LocalLog wtfHistory,
+ @Nullable ComponentName serviceComponentName,
+ @NonNull ComponentName componentName,
+ boolean compatMode,
+ boolean bindInstantServiceAllowed,
+ boolean forAugmentedAutofillOnly,
+ int flags,
@NonNull InputMethodManagerInternal inputMethodManagerInternal,
boolean isPrimaryCredential) {
if (sessionId < 0) {
@@ -1533,22 +1605,40 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
primaryServiceComponentName = serviceComponentName;
secondaryServiceComponentName = mCredentialAutofillService;
}
- Slog.v(TAG, "Primary service component name: " + primaryServiceComponentName
- + ", secondary service component name: " + secondaryServiceComponentName);
-
- mRemoteFillService = primaryServiceComponentName == null ? null
- : new RemoteFillService(context, primaryServiceComponentName, userId, this,
- bindInstantServiceAllowed, mCredentialAutofillService);
- mSecondaryProviderHandler = secondaryServiceComponentName == null ? null
- : new SecondaryProviderHandler(context, userId, bindInstantServiceAllowed,
- this::onSecondaryFillResponse, secondaryServiceComponentName,
- mCredentialAutofillService);
+ Slog.v(
+ TAG,
+ "Primary service component name: "
+ + primaryServiceComponentName
+ + ", secondary service component name: "
+ + secondaryServiceComponentName);
+
+ mRemoteFillService =
+ primaryServiceComponentName == null
+ ? null
+ : new RemoteFillService(
+ context,
+ primaryServiceComponentName,
+ userId,
+ this,
+ bindInstantServiceAllowed,
+ mCredentialAutofillService);
+ mSecondaryProviderHandler =
+ secondaryServiceComponentName == null
+ ? null
+ : new SecondaryProviderHandler(
+ context,
+ userId,
+ bindInstantServiceAllowed,
+ this::onSecondaryFillResponse,
+ secondaryServiceComponentName,
+ mCredentialAutofillService);
mActivityToken = activityToken;
mHasCallback = hasCallback;
mUiLatencyHistory = uiLatencyHistory;
mWtfHistory = wtfHistory;
- int displayId = LocalServices.getService(ActivityTaskManagerInternal.class)
- .getDisplayId(activityToken);
+ int displayId =
+ LocalServices.getService(ActivityTaskManagerInternal.class)
+ .getDisplayId(activityToken);
mContext = Helper.getDisplayContext(context, displayId);
mComponentName = componentName;
mCompatMode = compatMode;
@@ -1557,8 +1647,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
mStartTime = SystemClock.elapsedRealtime();
mLatencyBaseTime = mStartTime;
mRequestCount = 0;
- mPresentationStatsEventLogger = PresentationStatsEventLogger.createPresentationLog(
- sessionId, uid, mLatencyBaseTime);
+ mPresentationStatsEventLogger =
+ PresentationStatsEventLogger.createPresentationLog(
+ sessionId, uid, mLatencyBaseTime);
mFillRequestEventLogger = FillRequestEventLogger.forSessionId(sessionId);
mFillResponseEventLogger = FillResponseEventLogger.forSessionId(sessionId);
mSessionCommittedEventLogger = SessionCommittedEventLogger.forSessionId(sessionId);
@@ -1574,33 +1665,39 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
setClientLocked(client);
}
- mInlineSessionController = new AutofillInlineSessionController(inputMethodManagerInternal,
- userId, componentName, handler, mLock,
- new InlineFillUi.InlineUiEventCallback() {
- @Override
- public void notifyInlineUiShown(AutofillId autofillId) {
- notifyFillUiShown(autofillId);
- }
+ mInlineSessionController =
+ new AutofillInlineSessionController(
+ inputMethodManagerInternal,
+ userId,
+ componentName,
+ handler,
+ mLock,
+ new InlineFillUi.InlineUiEventCallback() {
+ @Override
+ public void notifyInlineUiShown(AutofillId autofillId) {
+ notifyFillUiShown(autofillId);
+ }
- @Override
- public void notifyInlineUiHidden(AutofillId autofillId) {
- notifyFillUiHidden(autofillId);
- }
- });
+ @Override
+ public void notifyInlineUiHidden(AutofillId autofillId) {
+ notifyFillUiHidden(autofillId);
+ }
+ });
- mMetricsLogger.write(newLogMaker(MetricsEvent.AUTOFILL_SESSION_STARTED)
- .addTaggedData(MetricsEvent.FIELD_AUTOFILL_FLAGS, flags));
+ mMetricsLogger.write(
+ newLogMaker(MetricsEvent.AUTOFILL_SESSION_STARTED)
+ .addTaggedData(MetricsEvent.FIELD_AUTOFILL_FLAGS, flags));
mLogViewEntered = false;
}
private ComponentName getCredentialAutofillService(Context context) {
ComponentName componentName = null;
- String credentialManagerAutofillCompName = context.getResources().getString(
- R.string.config_defaultCredentialManagerAutofillService);
+ String credentialManagerAutofillCompName =
+ context.getResources()
+ .getString(R.string.config_defaultCredentialManagerAutofillService);
if (credentialManagerAutofillCompName != null
&& !credentialManagerAutofillCompName.isEmpty()) {
- componentName = ComponentName.unflattenFromString(
- credentialManagerAutofillCompName);
+ componentName = ComponentName.unflattenFromString(credentialManagerAutofillCompName);
}
if (componentName == null) {
Slog.w(TAG, "Invalid CredentialAutofillService");
@@ -1614,7 +1711,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
* @return The activity token
*/
@GuardedBy("mLock")
- @NonNull IBinder getActivityTokenLocked() {
+ @NonNull
+ IBinder getActivityTokenLocked() {
return mActivityToken;
}
@@ -1627,8 +1725,11 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
void switchActivity(@NonNull IBinder newActivity, @NonNull IBinder newClient) {
synchronized (mLock) {
if (mDestroyed) {
- Slog.w(TAG, "Call to Session#switchActivity() rejected - session: "
- + id + " destroyed");
+ Slog.w(
+ TAG,
+ "Call to Session#switchActivity() rejected - session: "
+ + id
+ + " destroyed");
return;
}
mActivityToken = newActivity;
@@ -1643,17 +1744,22 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
private void setClientLocked(@NonNull IBinder client) {
unlinkClientVultureLocked();
mClient = IAutoFillManagerClient.Stub.asInterface(client);
- mClientVulture = () -> {
- synchronized (mLock) {
- Slog.d(TAG, "handling death of " + mActivityToken + " when saving="
- + mSessionFlags.mShowingSaveUi);
- if (mSessionFlags.mShowingSaveUi) {
- mUi.hideFillUi(this);
- } else {
- mUi.destroyAll(mPendingSaveUi, this, false);
- }
- }
- };
+ mClientVulture =
+ () -> {
+ synchronized (mLock) {
+ Slog.d(
+ TAG,
+ "handling death of "
+ + mActivityToken
+ + " when saving="
+ + mSessionFlags.mShowingSaveUi);
+ if (mSessionFlags.mShowingSaveUi) {
+ mUi.hideFillUi(this);
+ } else {
+ mUi.destroyAll(mPendingSaveUi, this, false);
+ }
+ }
+ };
try {
mClient.asBinder().linkToDeath(mClientVulture, 0);
} catch (RemoteException e) {
@@ -1676,8 +1782,11 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
// FillServiceCallbacks
@Override
@SuppressWarnings("GuardedBy")
- public void onFillRequestSuccess(int requestId, @Nullable FillResponse response,
- @NonNull String servicePackageName, int requestFlags) {
+ public void onFillRequestSuccess(
+ int requestId,
+ @Nullable FillResponse response,
+ @NonNull String servicePackageName,
+ int requestFlags) {
final AutofillId[] fieldClassificationIds;
final LogMaker requestLog;
@@ -1701,8 +1810,11 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
getDetectionPreferenceForLogging());
if (mDestroyed) {
- Slog.w(TAG, "Call to Session#onFillRequestSuccess() rejected - session: "
- + id + " destroyed");
+ Slog.w(
+ TAG,
+ "Call to Session#onFillRequestSuccess() rejected - session: "
+ + id
+ + " destroyed");
mFillResponseEventLogger.maybeSetResponseStatus(RESPONSE_STATUS_SESSION_DESTROYED);
mFillResponseEventLogger.logAndEndEvent();
return;
@@ -1713,8 +1825,11 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
// saveUi gets closed, the session will be destroyed and AutofillManager will reset
// its state. Processing the fill request will result in a great chance of corrupt
// state in Autofill.
- Slog.w(TAG, "Call to Session#onFillRequestSuccess() rejected - session: "
- + id + " is showing saveUi");
+ Slog.w(
+ TAG,
+ "Call to Session#onFillRequestSuccess() rejected - session: "
+ + id
+ + " is showing saveUi");
mFillResponseEventLogger.maybeSetResponseStatus(RESPONSE_STATUS_SESSION_DESTROYED);
mFillResponseEventLogger.logAndEndEvent();
return;
@@ -1760,22 +1875,21 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
}
-
final long disableDuration = response.getDisableDuration();
final boolean autofillDisabled = disableDuration > 0;
if (autofillDisabled) {
final int flags = response.getFlags();
final boolean disableActivityOnly =
(flags & FillResponse.FLAG_DISABLE_ACTIVITY_ONLY) != 0;
- notifyDisableAutofillToClient(disableDuration,
- disableActivityOnly ? mComponentName : null);
+ notifyDisableAutofillToClient(
+ disableDuration, disableActivityOnly ? mComponentName : null);
if (disableActivityOnly) {
- mService.disableAutofillForActivity(mComponentName, disableDuration,
- id, mCompatMode);
+ mService.disableAutofillForActivity(
+ mComponentName, disableDuration, id, mCompatMode);
} else {
- mService.disableAutofillForApp(mComponentName.getPackageName(), disableDuration,
- id, mCompatMode);
+ mService.disableAutofillForApp(
+ mComponentName.getPackageName(), disableDuration, id, mCompatMode);
}
synchronized (mLock) {
@@ -1786,17 +1900,22 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
if (triggerAugmentedAutofillLocked(requestFlags) != null) {
mSessionFlags.mAugmentedAutofillOnly = true;
if (sDebug) {
- Slog.d(TAG, "Service disabled autofill for " + mComponentName
- + ", but session is kept for augmented autofill only");
+ Slog.d(
+ TAG,
+ "Service disabled autofill for "
+ + mComponentName
+ + ", but session is kept for augmented autofill only");
}
return;
}
}
if (sDebug) {
- final StringBuilder message = new StringBuilder("Service disabled autofill for ")
+ final StringBuilder message =
+ new StringBuilder("Service disabled autofill for ")
.append(mComponentName)
- .append(": flags=").append(flags)
+ .append(": flags=")
+ .append(flags)
.append(", duration=");
TimeUtils.formatDuration(disableDuration, message);
Slog.d(TAG, message.toString());
@@ -1816,8 +1935,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
if (requestLog != null) {
- requestLog.addTaggedData(MetricsEvent.FIELD_AUTOFILL_NUM_DATASETS,
- response.getDatasets() == null ? 0 : response.getDatasets().size());
+ requestLog.addTaggedData(
+ MetricsEvent.FIELD_AUTOFILL_NUM_DATASETS,
+ response.getDatasets() == null ? 0 : response.getDatasets().size());
if (fieldClassificationIds != null) {
requestLog.addTaggedData(
MetricsEvent.FIELD_AUTOFILL_NUM_FIELD_CLASSIFICATION_IDS,
@@ -1840,10 +1960,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
}
-
@GuardedBy("mLock")
- private void processResponseLockedForPcc(@NonNull FillResponse response,
- @Nullable Bundle newClientState, int flags) {
+ private void processResponseLockedForPcc(
+ @NonNull FillResponse response, @Nullable Bundle newClientState, int flags) {
if (DBG) {
Slog.d(TAG, "DBG: Initial response: " + response);
}
@@ -1851,9 +1970,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
response = getEffectiveFillResponse(response);
if (isEmptyResponse(response)) {
// Treat it as a null response.
- processNullResponseLocked(
- response != null ? response.getRequestId() : 0,
- flags);
+ processNullResponseLocked(response != null ? response.getRequestId() : 0, flags);
return;
}
if (DBG) {
@@ -1870,9 +1987,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
return ((response.getDatasets() == null || response.getDatasets().isEmpty())
&& response.getAuthentication() == null
&& (saveInfo == null
- || (ArrayUtils.isEmpty(saveInfo.getOptionalIds())
- && ArrayUtils.isEmpty(saveInfo.getRequiredIds())
- && ((saveInfo.getFlags() & SaveInfo.FLAG_DELAY_SAVE) == 0)))
+ || (ArrayUtils.isEmpty(saveInfo.getOptionalIds())
+ && ArrayUtils.isEmpty(saveInfo.getRequiredIds())
+ && ((saveInfo.getFlags() & SaveInfo.FLAG_DELAY_SAVE) == 0)))
&& (ArrayUtils.isEmpty(response.getFieldClassificationIds())));
}
}
@@ -1884,10 +2001,12 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
computeDatasetsForProviderAndUpdateContainer(response, autofillProviderContainer);
if (DBG) {
- Slog.d(TAG, "DBG: computeDatasetsForProviderAndUpdateContainer: "
- + autofillProviderContainer);
+ Slog.d(
+ TAG,
+ "DBG: computeDatasetsForProviderAndUpdateContainer: "
+ + autofillProviderContainer);
}
- if (!mService.isPccClassificationEnabled()) {
+ if (!mService.isPccClassificationEnabled()) {
if (sVerbose) {
Slog.v(TAG, "PCC classification is disabled");
}
@@ -1897,10 +2016,14 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
if (mClassificationState.mState != ClassificationState.STATE_RESPONSE
|| mClassificationState.mLastFieldClassificationResponse == null) {
if (sVerbose) {
- Slog.v(TAG, "PCC classification no last response:"
- + (mClassificationState.mLastFieldClassificationResponse == null)
- + " ,ineligible state="
- + (mClassificationState.mState != ClassificationState.STATE_RESPONSE));
+ Slog.v(
+ TAG,
+ "PCC classification no last response:"
+ + (mClassificationState.mLastFieldClassificationResponse
+ == null)
+ + " ,ineligible state="
+ + (mClassificationState.mState
+ != ClassificationState.STATE_RESPONSE));
}
return createShallowCopy(response, autofillProviderContainer);
}
@@ -1966,8 +2089,11 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
mFillResponseEventLogger.maybeSetLatencyFillResponseReceivedMillis(
(int) (fillRequestReceivedRelativeTimestamp));
if (mDestroyed) {
- Slog.w(TAG, "Call to Session#onSecondaryFillResponse() rejected - session: "
- + id + " destroyed");
+ Slog.w(
+ TAG,
+ "Call to Session#onSecondaryFillResponse() rejected - session: "
+ + id
+ + " destroyed");
mFillResponseEventLogger.maybeSetResponseStatus(RESPONSE_STATUS_SESSION_DESTROYED);
mFillResponseEventLogger.logAndEndEvent();
return;
@@ -1981,7 +2107,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
mSecondaryResponses = new SparseArray<>(2);
}
mSecondaryResponses.put(fillResponse.getRequestId(), fillResponse);
- setViewStatesLocked(fillResponse, ViewState.STATE_FILLABLE, /* clearResponse= */ false,
+ setViewStatesLocked(
+ fillResponse,
+ ViewState.STATE_FILLABLE,
+ /* clearResponse= */ false,
/* isPrimary= */ false);
// Updates the UI, if necessary.
@@ -1997,16 +2126,15 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
private FillResponse createShallowCopy(
FillResponse response, DatasetComputationContainer container) {
return FillResponse.shallowCopy(
- response,
- new ArrayList<>(container.mDatasets),
- getEligibleSaveInfo(response));
+ response, new ArrayList<>(container.mDatasets), getEligibleSaveInfo(response));
}
private SaveInfo getEligibleSaveInfo(FillResponse response) {
SaveInfo saveInfo = response.getSaveInfo();
- if (saveInfo == null || (!ArrayUtils.isEmpty(saveInfo.getOptionalIds())
- || !ArrayUtils.isEmpty(saveInfo.getRequiredIds())
- || (saveInfo.getFlags() & SaveInfo.FLAG_DELAY_SAVE) != 0)) {
+ if (saveInfo == null
+ || (!ArrayUtils.isEmpty(saveInfo.getOptionalIds())
+ || !ArrayUtils.isEmpty(saveInfo.getRequiredIds())
+ || (saveInfo.getFlags() & SaveInfo.FLAG_DELAY_SAVE) != 0)) {
return saveInfo;
}
synchronized (mLock) {
@@ -2019,12 +2147,12 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
ArraySet<AutofillId> ids = new ArraySet<>();
int saveType = saveInfo.getType();
if (saveType == SaveInfo.SAVE_DATA_TYPE_GENERIC) {
- for (Set<AutofillId> autofillIds: hintsToAutofillIdMap.values()) {
+ for (Set<AutofillId> autofillIds : hintsToAutofillIdMap.values()) {
ids.addAll(autofillIds);
}
} else {
Set<String> hints = HintsHelper.getHintsForSaveType(saveType);
- for (Map.Entry<String, Set<AutofillId>> entry: hintsToAutofillIdMap.entrySet()) {
+ for (Map.Entry<String, Set<AutofillId>> entry : hintsToAutofillIdMap.entrySet()) {
String hint = entry.getKey();
if (hints.contains(hint)) {
ids.addAll(entry.getValue());
@@ -2039,9 +2167,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
}
- /**
- * A private class to hold & compute datasets to be shown
- */
+ /** A private class to hold & compute datasets to be shown */
private static class DatasetComputationContainer {
// List of all autofill ids that have a corresponding datasets
Set<AutofillId> mAutofillIds = new LinkedHashSet<>();
@@ -2103,9 +2229,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
/**
- * Computes datasets that are eligible to be shown based on provider detections.
- * Datasets are populated in the provided container for them to be later merged with the
- * PCC eligible datasets based on preference strategy.
+ * Computes datasets that are eligible to be shown based on provider detections. Datasets are
+ * populated in the provided container for them to be later merged with the PCC eligible
+ * datasets based on preference strategy.
+ *
* @param response
* @param container
*/
@@ -2210,9 +2337,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
/**
- * Computes datasets that are eligible to be shown based on PCC detections.
- * Datasets are populated in the provided container for them to be later merged with the
- * provider eligible datasets based on preference strategy.
+ * Computes datasets that are eligible to be shown based on PCC detections. Datasets are
+ * populated in the provided container for them to be later merged with the provider eligible
+ * datasets based on preference strategy.
+ *
* @param response
* @param container
*/
@@ -2267,14 +2395,21 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
// For that, there has to be a datatype detected by PCC, and the dataset
// for that datatype provided by the provider.
AutofillId autofillId = dataset.getFieldIds().get(j);
- if (!mClassificationState.mClassificationCombinedHintsMap
- .containsKey(autofillId)) {
+ if (!mClassificationState.mClassificationCombinedHintsMap.containsKey(
+ autofillId)) {
additionalEligibleAutofillIds.add(autofillId);
additionalDatasetAutofillIds.add(autofillId);
// For each of the field, copy over values.
- copyFieldsFromDataset(dataset, j, autofillId, fieldIds, fieldValues,
- fieldPresentations, fieldDialogPresentations,
- fieldInlinePresentations, fieldInlineTooltipPresentations,
+ copyFieldsFromDataset(
+ dataset,
+ j,
+ autofillId,
+ fieldIds,
+ fieldValues,
+ fieldPresentations,
+ fieldDialogPresentations,
+ fieldInlinePresentations,
+ fieldInlineTooltipPresentations,
fieldFilters);
}
continue;
@@ -2292,9 +2427,16 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
eligibleAutofillIds.add(autofillId);
datasetAutofillIds.add(autofillId);
// For each of the field, copy over values.
- copyFieldsFromDataset(dataset, j, autofillId, fieldIds, fieldValues,
- fieldPresentations, fieldDialogPresentations,
- fieldInlinePresentations, fieldInlineTooltipPresentations,
+ copyFieldsFromDataset(
+ dataset,
+ j,
+ autofillId,
+ fieldIds,
+ fieldValues,
+ fieldPresentations,
+ fieldDialogPresentations,
+ fieldInlinePresentations,
+ fieldInlineTooltipPresentations,
fieldFilters);
}
}
@@ -2364,8 +2506,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
fieldPresentations.add(dataset.getFieldPresentation(index));
fieldDialogPresentations.add(dataset.getFieldDialogPresentation(index));
fieldInlinePresentations.add(dataset.getFieldInlinePresentation(index));
- fieldInlineTooltipPresentations.add(
- dataset.getFieldInlineTooltipPresentation(index));
+ fieldInlineTooltipPresentations.add(dataset.getFieldInlineTooltipPresentation(index));
fieldFilters.add(dataset.getFilter(index));
}
@@ -2395,16 +2536,22 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
unregisterDelayedFillBroadcastLocked();
if (mDestroyed) {
- Slog.w(TAG, "Call to Session#onFillRequestFailureOrTimeout(req=" + requestId
- + ") rejected - session: " + id + " destroyed");
+ Slog.w(
+ TAG,
+ "Call to Session#onFillRequestFailureOrTimeout(req="
+ + requestId
+ + ") rejected - session: "
+ + id
+ + " destroyed");
mFillResponseEventLogger.maybeSetResponseStatus(RESPONSE_STATUS_SESSION_DESTROYED);
mFillResponseEventLogger.logAndEndEvent();
return;
}
if (sDebug) {
- Slog.d(TAG, "finishing session due to service "
- + (timedOut ? "timeout" : "failure"));
+ Slog.d(
+ TAG,
+ "finishing session due to service " + (timedOut ? "timeout" : "failure"));
}
mService.resetLastResponse();
mLastFillDialogTriggerIds = null;
@@ -2418,12 +2565,16 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
final int targetSdk = mService.getTargedSdkLocked();
if (targetSdk >= Build.VERSION_CODES.Q) {
showMessage = false;
- Slog.w(TAG, "onFillRequestFailureOrTimeout(): not showing '" + message
- + "' because service's targetting API " + targetSdk);
+ Slog.w(
+ TAG,
+ "onFillRequestFailureOrTimeout(): not showing '"
+ + message
+ + "' because service's targeting API "
+ + targetSdk);
}
if (message != null) {
- requestLog.addTaggedData(MetricsEvent.FIELD_AUTOFILL_TEXT_LEN,
- message.length());
+ requestLog.addTaggedData(
+ MetricsEvent.FIELD_AUTOFILL_TEXT_LEN, message.length());
}
}
@@ -2445,8 +2596,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
mFillResponseEventLogger.maybeSetLatencyResponseProcessingMillis();
mFillResponseEventLogger.logAndEndEvent();
}
- notifyUnavailableToClient(AutofillManager.STATE_UNKNOWN_FAILED,
- /* autofillableIds= */ null);
+ notifyUnavailableToClient(
+ AutofillManager.STATE_UNKNOWN_FAILED, /* autofillableIds= */ null);
if (showMessage) {
getUiForShowing().showError(message, this);
}
@@ -2455,8 +2606,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
// FillServiceCallbacks
@Override
- public void onSaveRequestSuccess(@NonNull String servicePackageName,
- @Nullable IntentSender intentSender) {
+ public void onSaveRequestSuccess(
+ @NonNull String servicePackageName, @Nullable IntentSender intentSender) {
synchronized (mLock) {
mSessionFlags.mShowingSaveUi = false;
// Log onSaveRequest result.
@@ -2464,16 +2615,22 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
mSaveEventLogger.maybeSetLatencySaveFinishMillis();
mSaveEventLogger.logAndEndEvent();
if (mDestroyed) {
- Slog.w(TAG, "Call to Session#onSaveRequestSuccess() rejected - session: "
- + id + " destroyed");
+ Slog.w(
+ TAG,
+ "Call to Session#onSaveRequestSuccess() rejected - session: "
+ + id
+ + " destroyed");
return;
}
}
- LogMaker log = newLogMaker(MetricsEvent.AUTOFILL_DATA_SAVE_REQUEST, servicePackageName)
- .setType(intentSender == null ? MetricsEvent.TYPE_SUCCESS : MetricsEvent.TYPE_OPEN);
+ LogMaker log =
+ newLogMaker(MetricsEvent.AUTOFILL_DATA_SAVE_REQUEST, servicePackageName)
+ .setType(
+ intentSender == null
+ ? MetricsEvent.TYPE_SUCCESS
+ : MetricsEvent.TYPE_OPEN);
mMetricsLogger.write(log);
-
if (intentSender != null) {
if (sDebug) Slog.d(TAG, "Starting intent sender on save()");
startIntentSenderAndFinishSession(intentSender);
@@ -2485,8 +2642,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
// FillServiceCallbacks
@Override
- public void onSaveRequestFailure(@Nullable CharSequence message,
- @NonNull String servicePackageName) {
+ public void onSaveRequestFailure(
+ @Nullable CharSequence message, @NonNull String servicePackageName) {
boolean showMessage = !TextUtils.isEmpty(message);
synchronized (mLock) {
@@ -2495,28 +2652,34 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
mSaveEventLogger.maybeSetLatencySaveFinishMillis();
mSaveEventLogger.logAndEndEvent();
if (mDestroyed) {
- Slog.w(TAG, "Call to Session#onSaveRequestFailure() rejected - session: "
- + id + " destroyed");
+ Slog.w(
+ TAG,
+ "Call to Session#onSaveRequestFailure() rejected - session: "
+ + id
+ + " destroyed");
return;
}
if (showMessage) {
final int targetSdk = mService.getTargedSdkLocked();
if (targetSdk >= Build.VERSION_CODES.Q) {
showMessage = false;
- Slog.w(TAG, "onSaveRequestFailure(): not showing '" + message
- + "' because service's targetting API " + targetSdk);
+ Slog.w(
+ TAG,
+ "onSaveRequestFailure(): not showing '"
+ + message
+ + "' because service's targeting API "
+ + targetSdk);
}
}
}
final LogMaker log =
newLogMaker(MetricsEvent.AUTOFILL_DATA_SAVE_REQUEST, servicePackageName)
- .setType(MetricsEvent.TYPE_FAILURE);
+ .setType(MetricsEvent.TYPE_FAILURE);
if (message != null) {
log.addTaggedData(MetricsEvent.FIELD_AUTOFILL_TEXT_LEN, message.length());
}
mMetricsLogger.write(log);
-
if (showMessage) {
getUiForShowing().showError(message, this);
}
@@ -2525,8 +2688,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
// FillServiceCallbacks
@Override
- public void onConvertCredentialRequestSuccess(@NonNull ConvertCredentialResponse
- convertCredentialResponse) {
+ public void onConvertCredentialRequestSuccess(
+ @NonNull ConvertCredentialResponse convertCredentialResponse) {
Dataset dataset = convertCredentialResponse.getDataset();
Bundle clientState = convertCredentialResponse.getClientState();
if (dataset != null) {
@@ -2534,15 +2697,18 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
if (clientState != null) {
requestId = clientState.getInt(EXTRA_AUTOFILL_REQUEST_ID);
} else {
- Slog.e(TAG, "onConvertCredentialRequestSuccess(): client state is null, this "
- + "would cause loss in logging.");
+ Slog.e(
+ TAG,
+ "onConvertCredentialRequestSuccess(): client state is null, this "
+ + "would cause loss in logging.");
}
// TODO: Add autofill related logging; consider whether to log the index
- fill(requestId, /* datasetIndex=*/ -1, dataset, UI_TYPE_CREDMAN_BOTTOM_SHEET);
+ fill(requestId, /* datasetIndex= */ -1, dataset, UI_TYPE_CREDMAN_BOTTOM_SHEET);
} else {
// TODO: Add logging to log this error case
- Slog.e(TAG, "onConvertCredentialRequestSuccess(): dataset inside response is "
- + "null");
+ Slog.e(
+ TAG,
+ "onConvertCredentialRequestSuccess(): dataset inside response is " + "null");
}
}
@@ -2550,11 +2716,11 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
* Gets the {@link FillContext} for a request.
*
* @param requestId The id of the request
- *
* @return The context or {@code null} if there is no context
*/
@GuardedBy("mLock")
- @Nullable private FillContext getFillContextByRequestIdLocked(int requestId) {
+ @Nullable
+ private FillContext getFillContextByRequestIdLocked(int requestId) {
if (mContexts == null) {
return null;
}
@@ -2582,19 +2748,26 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
// AutoFillUiCallback
@Override
- public void authenticate(int requestId, int datasetIndex, IntentSender intent, Bundle extras,
- int uiType) {
+ public void authenticate(
+ int requestId, int datasetIndex, IntentSender intent, Bundle extras, int uiType) {
if (sDebug) {
- Slog.d(TAG, "authenticate(): requestId=" + requestId + "; datasetIdx=" + datasetIndex
- + "; intentSender=" + intent);
+ Slog.d(
+ TAG,
+ "authenticate(): requestId="
+ + requestId
+ + "; datasetIdx="
+ + datasetIndex
+ + "; intentSender="
+ + intent);
}
final Intent fillInIntent;
synchronized (mLock) {
mPresentationStatsEventLogger.maybeSetAuthenticationType(
- AUTHENTICATION_TYPE_FULL_AUTHENTICATION);
+ AUTHENTICATION_TYPE_FULL_AUTHENTICATION);
if (mDestroyed) {
- Slog.w(TAG, "Call to Session#authenticate() rejected - session: "
- + id + " destroyed");
+ Slog.w(
+ TAG,
+ "Call to Session#authenticate() rejected - session: " + id + " destroyed");
return;
}
fillInIntent = createAuthFillInIntentLocked(requestId, extras);
@@ -2607,10 +2780,14 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
mService.setAuthenticationSelected(id, mClientState, uiType);
final int authenticationId = AutofillManager.makeAuthenticationId(requestId, datasetIndex);
- mHandler.sendMessage(obtainMessage(
- Session::startAuthentication,
- this, authenticationId, intent, fillInIntent,
- /* authenticateInline= */ uiType == UI_TYPE_INLINE));
+ mHandler.sendMessage(
+ obtainMessage(
+ Session::startAuthentication,
+ this,
+ authenticationId,
+ intent,
+ fillInIntent,
+ /* authenticateInline= */ uiType == UI_TYPE_INLINE));
}
// AutoFillUiCallback
@@ -2618,14 +2795,13 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
public void fill(int requestId, int datasetIndex, Dataset dataset, int uiType) {
synchronized (mLock) {
if (mDestroyed) {
- Slog.w(TAG, "Call to Session#fill() rejected - session: "
- + id + " destroyed");
+ Slog.w(TAG, "Call to Session#fill() rejected - session: " + id + " destroyed");
return;
}
}
- mHandler.sendMessage(obtainMessage(
- Session::autoFill,
- this, requestId, datasetIndex, dataset, true, uiType));
+ mHandler.sendMessage(
+ obtainMessage(
+ Session::autoFill, this, requestId, datasetIndex, dataset, true, uiType));
}
// AutoFillUiCallback
@@ -2633,15 +2809,13 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
public void save() {
synchronized (mLock) {
if (mDestroyed) {
- Slog.w(TAG, "Call to Session#save() rejected - session: "
- + id + " destroyed");
+ Slog.w(TAG, "Call to Session#save() rejected - session: " + id + " destroyed");
return;
}
mSaveEventLogger.maybeSetLatencySaveRequestMillis();
}
- mHandler.sendMessage(obtainMessage(
- AutofillManagerServiceImpl::handleSessionSave,
- mService, this));
+ mHandler.sendMessage(
+ obtainMessage(AutofillManagerServiceImpl::handleSessionSave, mService, this));
}
// AutoFillUiCallback
@@ -2650,13 +2824,13 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
synchronized (mLock) {
mSessionFlags.mShowingSaveUi = false;
if (mDestroyed) {
- Slog.w(TAG, "Call to Session#cancelSave() rejected - session: "
- + id + " destroyed");
+ Slog.w(
+ TAG,
+ "Call to Session#cancelSave() rejected - session: " + id + " destroyed");
return;
}
}
- mHandler.sendMessage(obtainMessage(
- Session::removeFromService, this));
+ mHandler.sendMessage(obtainMessage(Session::removeFromService, this));
}
// AutofillUiCallback
@@ -2692,26 +2866,34 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
// AutoFillUiCallback
@Override
- public void requestShowFillUi(AutofillId id, int width, int height,
- IAutofillWindowPresenter presenter) {
+ public void requestShowFillUi(
+ AutofillId id, int width, int height, IAutofillWindowPresenter presenter) {
synchronized (mLock) {
if (mDestroyed) {
- Slog.w(TAG, "Call to Session#requestShowFillUi() rejected - session: "
- + id + " destroyed");
+ Slog.w(
+ TAG,
+ "Call to Session#requestShowFillUi() rejected - session: "
+ + id
+ + " destroyed");
return;
}
if (id.equals(mCurrentViewId)) {
try {
final ViewState view = mViewStates.get(id);
- mClient.requestShowFillUi(this.id, id, width, height, view.getVirtualBounds(),
- presenter);
+ mClient.requestShowFillUi(
+ this.id, id, width, height, view.getVirtualBounds(), presenter);
} catch (RemoteException e) {
Slog.e(TAG, "Error requesting to show fill UI", e);
}
} else {
if (sDebug) {
- Slog.d(TAG, "Do not show full UI on " + id + " as it is not the current view ("
- + mCurrentViewId + ") anymore");
+ Slog.d(
+ TAG,
+ "Do not show full UI on "
+ + id
+ + " as it is not the current view ("
+ + mCurrentViewId
+ + ") anymore");
}
}
}
@@ -2722,8 +2904,11 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
public void dispatchUnhandledKey(AutofillId id, KeyEvent keyEvent) {
synchronized (mLock) {
if (mDestroyed) {
- Slog.w(TAG, "Call to Session#dispatchUnhandledKey() rejected - session: "
- + id + " destroyed");
+ Slog.w(
+ TAG,
+ "Call to Session#dispatchUnhandledKey() rejected - session: "
+ + id
+ + " destroyed");
return;
}
if (id.equals(mCurrentViewId)) {
@@ -2733,8 +2918,13 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
Slog.e(TAG, "Error requesting to dispatch unhandled key", e);
}
} else {
- Slog.w(TAG, "Do not dispatch unhandled key on " + id
- + " as it is not the current view (" + mCurrentViewId + ") anymore");
+ Slog.w(
+ TAG,
+ "Do not dispatch unhandled key on "
+ + id
+ + " as it is not the current view ("
+ + mCurrentViewId
+ + ") anymore");
}
}
}
@@ -2790,17 +2980,19 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
public void startIntentSender(IntentSender intentSender, Intent intent) {
synchronized (mLock) {
if (mDestroyed) {
- Slog.w(TAG, "Call to Session#startIntentSender() rejected - session: "
- + id + " destroyed");
+ Slog.w(
+ TAG,
+ "Call to Session#startIntentSender() rejected - session: "
+ + id
+ + " destroyed");
return;
}
if (intent == null) {
removeFromServiceLocked();
}
}
- mHandler.sendMessage(obtainMessage(
- Session::doStartIntentSender,
- this, intentSender, intent));
+ mHandler.sendMessage(
+ obtainMessage(Session::doStartIntentSender, this, intentSender, intent));
}
// AutoFillUiCallback
@@ -2865,13 +3057,17 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
@GuardedBy("mLock")
void setAuthenticationResultLocked(Bundle data, int authenticationId) {
if (mDestroyed) {
- Slog.w(TAG, "Call to Session#setAuthenticationResultLocked() rejected - session: "
- + id + " destroyed");
+ Slog.w(
+ TAG,
+ "Call to Session#setAuthenticationResultLocked() rejected - session: "
+ + id
+ + " destroyed");
return;
}
if (sDebug) {
- Slog.d(TAG, "setAuthenticationResultLocked(): id= " + authenticationId
- + ", data=" + data);
+ Slog.d(
+ TAG,
+ "setAuthenticationResultLocked(): id= " + authenticationId + ", data=" + data);
}
final int requestId = AutofillManager.getRequestIdFromAuthenticationId(authenticationId);
if (requestId == AUGMENTED_AUTOFILL_REQUEST_ID) {
@@ -2890,9 +3086,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
removeFromService();
return;
}
- final FillResponse authenticatedResponse = mRequestId.isSecondaryProvider(requestId)
- ? mSecondaryResponses.get(requestId)
- : mResponses.get(requestId);
+ final FillResponse authenticatedResponse =
+ mRequestId.isSecondaryProvider(requestId)
+ ? mSecondaryResponses.get(requestId)
+ : mResponses.get(requestId);
if (authenticatedResponse == null || data == null) {
Slog.w(TAG, "no authenticated response");
mPresentationStatsEventLogger.maybeSetAuthenticationResult(
@@ -2902,8 +3099,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
return;
}
- final int datasetIdx = AutofillManager.getDatasetIdFromAuthenticationId(
- authenticationId);
+ final int datasetIdx = AutofillManager.getDatasetIdFromAuthenticationId(authenticationId);
Dataset dataset = null;
// Authenticated a dataset - reset view state regardless if we got a response or a dataset
if (datasetIdx != AutofillManager.AUTHENTICATION_ID_DATASET_ID_UNDEFINED) {
@@ -2922,33 +3118,45 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
mSessionFlags.mExpiredResponse = false;
final Parcelable result = data.getParcelable(AutofillManager.EXTRA_AUTHENTICATION_RESULT);
- final GetCredentialException exception = data.getSerializable(
- CredentialProviderService.EXTRA_GET_CREDENTIAL_EXCEPTION,
- GetCredentialException.class);
+ final GetCredentialException exception =
+ data.getSerializable(
+ CredentialProviderService.EXTRA_GET_CREDENTIAL_EXCEPTION,
+ GetCredentialException.class);
final Bundle newClientState = data.getBundle(AutofillManager.EXTRA_CLIENT_STATE);
if (sDebug) {
- Slog.d(TAG, "setAuthenticationResultLocked(): result=" + result
- + ", clientState=" + newClientState + ", authenticationId=" + authenticationId);
- }
- if (Flags.autofillCredmanDevIntegration() && exception != null
+ Slog.d(
+ TAG,
+ "setAuthenticationResultLocked(): result="
+ + result
+ + ", clientState="
+ + newClientState
+ + ", authenticationId="
+ + authenticationId);
+ }
+ if (Flags.autofillCredmanDevIntegration()
+ && exception != null
&& !exception.getType().equals(GetCredentialException.TYPE_USER_CANCELED)) {
if (dataset != null && dataset.getFieldIds().size() == 1) {
if (sDebug) {
- Slog.d(TAG, "setAuthenticationResultLocked(): result returns with"
- + "Credential Manager Exception");
+ Slog.d(
+ TAG,
+ "setAuthenticationResultLocked(): result returns with"
+ + "Credential Manager Exception");
}
AutofillId autofillId = dataset.getFieldIds().get(0);
- sendCredentialManagerResponseToApp(/*response=*/ null,
- (GetCredentialException) exception, autofillId);
+ sendCredentialManagerResponseToApp(
+ /* response= */ null, (GetCredentialException) exception, autofillId);
}
return;
}
if (result instanceof FillResponse) {
if (sDebug) {
- Slog.d(TAG, "setAuthenticationResultLocked(): received FillResponse from"
- + " authentication flow");
+ Slog.d(
+ TAG,
+ "setAuthenticationResultLocked(): received FillResponse from"
+ + " authentication flow");
}
logAuthenticationStatusLocked(requestId, MetricsEvent.AUTOFILL_AUTHENTICATED);
mPresentationStatsEventLogger.maybeSetAuthenticationResult(
@@ -2963,33 +3171,40 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
if (dataset != null && dataset.getFieldIds().size() == 1) {
AutofillId autofillId = dataset.getFieldIds().get(0);
if (sDebug) {
- Slog.d(TAG, "Received GetCredentialResponse from authentication flow,"
- + "for autofillId: " + autofillId);
+ Slog.d(
+ TAG,
+ "Received GetCredentialResponse from authentication flow,"
+ + "for autofillId: "
+ + autofillId);
}
- sendCredentialManagerResponseToApp(response,
- /*exception=*/ null, autofillId);
+ sendCredentialManagerResponseToApp(response, /* exception= */ null, autofillId);
}
} else if (Flags.autofillCredmanIntegration()) {
- Dataset datasetFromCredentialResponse = getDatasetFromCredentialResponse(
- (GetCredentialResponse) result);
+ Dataset datasetFromCredentialResponse =
+ getDatasetFromCredentialResponse((GetCredentialResponse) result);
if (datasetFromCredentialResponse != null) {
- autoFill(requestId, datasetIdx, datasetFromCredentialResponse,
- false, UI_TYPE_UNKNOWN);
+ autoFill(
+ requestId,
+ datasetIdx,
+ datasetFromCredentialResponse,
+ false,
+ UI_TYPE_UNKNOWN);
}
}
} else if (result instanceof Dataset) {
if (sDebug) {
- Slog.d(TAG, "setAuthenticationResultLocked(): received Dataset from"
- + " authentication flow");
+ Slog.d(
+ TAG,
+ "setAuthenticationResultLocked(): received Dataset from"
+ + " authentication flow");
}
if (datasetIdx != AutofillManager.AUTHENTICATION_ID_DATASET_ID_UNDEFINED) {
- logAuthenticationStatusLocked(requestId,
- MetricsEvent.AUTOFILL_DATASET_AUTHENTICATED);
+ logAuthenticationStatusLocked(
+ requestId, MetricsEvent.AUTOFILL_DATASET_AUTHENTICATED);
mPresentationStatsEventLogger.maybeSetAuthenticationResult(
AUTHENTICATION_RESULT_SUCCESS);
if (newClientState != null) {
- if (sDebug)
- Slog.d(TAG, "Updating client state from auth dataset");
+ if (sDebug) Slog.d(TAG, "Updating client state from auth dataset");
mClientState = newClientState;
}
Dataset datasetFromResult = getEffectiveDatasetForAuthentication((Dataset) result);
@@ -2999,10 +3214,14 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
autoFill(requestId, datasetIdx, datasetFromResult, false, UI_TYPE_UNKNOWN);
} else {
- Slog.w(TAG, "invalid index (" + datasetIdx + ") for authentication id "
- + authenticationId);
- logAuthenticationStatusLocked(requestId,
- MetricsEvent.AUTOFILL_INVALID_DATASET_AUTHENTICATION);
+ Slog.w(
+ TAG,
+ "invalid index ("
+ + datasetIdx
+ + ") for authentication id "
+ + authenticationId);
+ logAuthenticationStatusLocked(
+ requestId, MetricsEvent.AUTOFILL_INVALID_DATASET_AUTHENTICATION);
mPresentationStatsEventLogger.maybeSetAuthenticationResult(
AUTHENTICATION_RESULT_FAILURE);
}
@@ -3010,8 +3229,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
if (result != null) {
Slog.w(TAG, "service returned invalid auth type: " + result);
}
- logAuthenticationStatusLocked(requestId,
- MetricsEvent.AUTOFILL_INVALID_AUTHENTICATION);
+ logAuthenticationStatusLocked(requestId, MetricsEvent.AUTOFILL_INVALID_AUTHENTICATION);
mPresentationStatsEventLogger.maybeSetAuthenticationResult(
AUTHENTICATION_RESULT_FAILURE);
processNullResponseLocked(requestId, 0);
@@ -3036,8 +3254,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
Slog.d(TAG, "DBG: authenticated effective response: " + response);
}
if (response == null || response.getDatasets().size() == 0) {
- Log.wtf(TAG, "No datasets in fill response on authentication. response = "
- + (response == null ? "null" : response.toString()));
+ Log.wtf(
+ TAG,
+ "No datasets in fill response on authentication. response = "
+ + (response == null ? "null" : response.toString()));
return authenticatedDataset;
}
List<Dataset> datasets = response.getDatasets();
@@ -3047,8 +3267,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
for (Dataset dataset : datasets) {
if (!dataset.getFieldIds().isEmpty()) {
for (int i = 0; i < dataset.getFieldIds().size(); i++) {
- builder.setField(dataset.getFieldIds().get(i),
- new Field.Builder().setValue(dataset.getFieldValues().get(i))
+ builder.setField(
+ dataset.getFieldIds().get(i),
+ new Field.Builder()
+ .setValue(dataset.getFieldValues().get(i))
.build());
}
}
@@ -3063,12 +3285,11 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
/**
- * Returns whether the dataset returned from the authentication result is ephemeral or not.
- * See {@link AutofillManager#EXTRA_AUTHENTICATION_RESULT_EPHEMERAL_DATASET} for more
- * information.
+ * Returns whether the dataset returned from the authentication result is ephemeral or not. See
+ * {@link AutofillManager#EXTRA_AUTHENTICATION_RESULT_EPHEMERAL_DATASET} for more information.
*/
- private static boolean isAuthResultDatasetEphemeral(@Nullable Dataset oldDataset,
- @NonNull Bundle authResultData) {
+ private static boolean isAuthResultDatasetEphemeral(
+ @Nullable Dataset oldDataset, @NonNull Bundle authResultData) {
if (authResultData.containsKey(
AutofillManager.EXTRA_AUTHENTICATION_RESULT_EPHEMERAL_DATASET)) {
return authResultData.getBoolean(
@@ -3079,11 +3300,11 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
/**
* A dataset can potentially have multiple fields, and it's possible that some of the fields'
- * has inline presentation and some don't. It's also possible that some of the fields'
- * inline presentation is pinned and some isn't. So the concept of whether a dataset is
- * pinned or not is ill-defined. Here we say a dataset is pinned if any of the field has a
- * pinned inline presentation in the dataset. It's not ideal but hopefully it is sufficient
- * for most of the cases.
+ * has inline presentation and some don't. It's also possible that some of the fields' inline
+ * presentation is pinned and some isn't. So the concept of whether a dataset is pinned or not
+ * is ill-defined. Here we say a dataset is pinned if any of the field has a pinned inline
+ * presentation in the dataset. It's not ideal but hopefully it is sufficient for most of the
+ * cases.
*/
private static boolean isPinnedDataset(@Nullable Dataset dataset) {
if (dataset != null && dataset.getFieldIds() != null) {
@@ -3100,16 +3321,30 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
@GuardedBy("mLock")
void setAuthenticationResultForAugmentedAutofillLocked(Bundle data, int authId) {
- final Dataset dataset = (data == null) ? null :
- data.getParcelable(AutofillManager.EXTRA_AUTHENTICATION_RESULT, android.service.autofill.Dataset.class);
+ final Dataset dataset =
+ (data == null)
+ ? null
+ : data.getParcelable(
+ AutofillManager.EXTRA_AUTHENTICATION_RESULT,
+ android.service.autofill.Dataset.class);
if (sDebug) {
- Slog.d(TAG, "Auth result for augmented autofill: sessionId=" + id
- + ", authId=" + authId + ", dataset=" + dataset);
- }
- final AutofillId fieldId = (dataset != null && dataset.getFieldIds().size() == 1)
- ? dataset.getFieldIds().get(0) : null;
- final AutofillValue value = (dataset != null && dataset.getFieldValues().size() == 1)
- ? dataset.getFieldValues().get(0) : null;
+ Slog.d(
+ TAG,
+ "Auth result for augmented autofill: sessionId="
+ + id
+ + ", authId="
+ + authId
+ + ", dataset="
+ + dataset);
+ }
+ final AutofillId fieldId =
+ (dataset != null && dataset.getFieldIds().size() == 1)
+ ? dataset.getFieldIds().get(0)
+ : null;
+ final AutofillValue value =
+ (dataset != null && dataset.getFieldValues().size() == 1)
+ ? dataset.getFieldValues().get(0)
+ : null;
final ClipData content = (dataset != null) ? dataset.getFieldContent() : null;
if (fieldId == null || (value == null && content == null)) {
if (sDebug) {
@@ -3154,8 +3389,14 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
// Fill the value into the field.
if (sDebug) {
- Slog.d(TAG, "Filling after auth: fieldId=" + fieldId + ", value=" + value
- + ", content=" + content);
+ Slog.d(
+ TAG,
+ "Filling after auth: fieldId="
+ + fieldId
+ + ", value="
+ + value
+ + ", content="
+ + content);
}
try {
if (content != null) {
@@ -3164,8 +3405,15 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
mClient.autofill(id, dataset.getFieldIds(), dataset.getFieldValues(), true);
}
} catch (RemoteException e) {
- Slog.w(TAG, "Error filling after auth: fieldId=" + fieldId + ", value=" + value
- + ", content=" + content, e);
+ Slog.w(
+ TAG,
+ "Error filling after auth: fieldId="
+ + fieldId
+ + ", value="
+ + value
+ + ", content="
+ + content,
+ e);
}
// Clear the suggestions since the user already accepted one of them.
@@ -3175,8 +3423,11 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
@GuardedBy("mLock")
void setHasCallbackLocked(boolean hasIt) {
if (mDestroyed) {
- Slog.w(TAG, "Call to Session#setHasCallbackLocked() rejected - session: "
- + id + " destroyed");
+ Slog.w(
+ TAG,
+ "Call to Session#setHasCallbackLocked() rejected - session: "
+ + id
+ + " destroyed");
return;
}
mHasCallback = hasIt;
@@ -3185,9 +3436,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
@GuardedBy("mLock")
@Nullable
private FillResponse getLastResponseLocked(@Nullable String logPrefixFmt) {
- final String logPrefix = sDebug && logPrefixFmt != null
- ? String.format(logPrefixFmt, this.id)
- : null;
+ final String logPrefix =
+ sDebug && logPrefixFmt != null ? String.format(logPrefixFmt, this.id) : null;
if (mContexts == null) {
if (logPrefix != null) Slog.d(TAG, logPrefix + ": no contexts");
return null;
@@ -3204,16 +3454,28 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
final int lastResponseIdx = getLastResponseIndexLocked();
if (lastResponseIdx < 0) {
if (logPrefix != null) {
- Slog.w(TAG, logPrefix + ": did not get last response. mResponses=" + mResponses
- + ", mViewStates=" + mViewStates);
+ Slog.w(
+ TAG,
+ logPrefix
+ + ": did not get last response. mResponses="
+ + mResponses
+ + ", mViewStates="
+ + mViewStates);
}
return null;
}
final FillResponse response = mResponses.valueAt(lastResponseIdx);
if (sVerbose && logPrefix != null) {
- Slog.v(TAG, logPrefix + ": mResponses=" + mResponses + ", mContexts=" + mContexts
- + ", mViewStates=" + mViewStates);
+ Slog.v(
+ TAG,
+ logPrefix
+ + ": mResponses="
+ + mResponses
+ + ", mContexts="
+ + mContexts
+ + ", mViewStates="
+ + mViewStates);
}
return response;
}
@@ -3232,9 +3494,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
/**
- * Get statistic information of save info in current session. Specifically
- * 1. how many save info the current session has.
- * 2. How many distinct save data types current session has.
+ * Get statistic information of save info in current session. Specifically 1. how many save info
+ * the current session has. 2. How many distinct save data types current session has.
*
* @return SaveInfoStats returns the above two number in a SaveInfoStats object
*/
@@ -3255,12 +3516,21 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
*/
public void logContextCommitted() {
if (sVerbose) {
- Slog.v(TAG, "logContextCommitted (" + id + "): commit_reason:" + COMMIT_REASON_UNKNOWN
- + " no_save_reason:" + Event.NO_SAVE_UI_REASON_NONE);
- }
- mHandler.sendMessage(obtainMessage(Session::handleLogContextCommitted, this,
- Event.NO_SAVE_UI_REASON_NONE,
- COMMIT_REASON_UNKNOWN));
+ Slog.v(
+ TAG,
+ "logContextCommitted ("
+ + id
+ + "): commit_reason:"
+ + COMMIT_REASON_UNKNOWN
+ + " no_save_reason:"
+ + Event.NO_SAVE_UI_REASON_NONE);
+ }
+ mHandler.sendMessage(
+ obtainMessage(
+ Session::handleLogContextCommitted,
+ this,
+ Event.NO_SAVE_UI_REASON_NONE,
+ COMMIT_REASON_UNKNOWN));
synchronized (mLock) {
logAllEventsLocked(COMMIT_REASON_UNKNOWN);
}
@@ -3274,16 +3544,25 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
* @param saveDialogNotShowReason The reason why a save dialog was not shown.
* @param commitReason The reason why context is committed.
*/
-
@GuardedBy("mLock")
- public void logContextCommittedLocked(@NoSaveReason int saveDialogNotShowReason,
- @AutofillCommitReason int commitReason) {
+ public void logContextCommittedLocked(
+ @NoSaveReason int saveDialogNotShowReason, @AutofillCommitReason int commitReason) {
if (sVerbose) {
- Slog.v(TAG, "logContextCommittedLocked (" + id + "): commit_reason:" + commitReason
- + " no_save_reason:" + saveDialogNotShowReason);
- }
- mHandler.sendMessage(obtainMessage(Session::handleLogContextCommitted, this,
- saveDialogNotShowReason, commitReason));
+ Slog.v(
+ TAG,
+ "logContextCommittedLocked ("
+ + id
+ + "): commit_reason:"
+ + commitReason
+ + " no_save_reason:"
+ + saveDialogNotShowReason);
+ }
+ mHandler.sendMessage(
+ obtainMessage(
+ Session::handleLogContextCommitted,
+ this,
+ saveDialogNotShowReason,
+ commitReason));
mSessionCommittedEventLogger.maybeSetCommitReason(commitReason);
mSessionCommittedEventLogger.maybeSetRequestCount(mRequestCount);
@@ -3295,8 +3574,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
mSaveEventLogger.maybeSetSaveUiNotShownReason(NO_SAVE_REASON_NONE);
}
- private void handleLogContextCommitted(@NoSaveReason int saveDialogNotShowReason,
- @AutofillCommitReason int commitReason) {
+ private void handleLogContextCommitted(
+ @NoSaveReason int saveDialogNotShowReason, @AutofillCommitReason int commitReason) {
final FillResponse lastResponse;
synchronized (mLock) {
lastResponse = getLastResponseLocked("logContextCommited(%s)");
@@ -3326,31 +3605,42 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
// Sets field classification scores
if (userData != null && fcStrategy != null) {
- logFieldClassificationScore(fcStrategy, userData, saveDialogNotShowReason,
- commitReason);
+ logFieldClassificationScore(
+ fcStrategy, userData, saveDialogNotShowReason, commitReason);
} else {
logContextCommitted(null, null, saveDialogNotShowReason, commitReason);
}
}
- private void logContextCommitted(@Nullable ArrayList<AutofillId> detectedFieldIds,
+ private void logContextCommitted(
+ @Nullable ArrayList<AutofillId> detectedFieldIds,
@Nullable ArrayList<FieldClassification> detectedFieldClassifications,
@NoSaveReason int saveDialogNotShowReason,
@AutofillCommitReason int commitReason) {
synchronized (mLock) {
- logContextCommittedLocked(detectedFieldIds, detectedFieldClassifications,
- saveDialogNotShowReason, commitReason);
+ logContextCommittedLocked(
+ detectedFieldIds,
+ detectedFieldClassifications,
+ saveDialogNotShowReason,
+ commitReason);
}
}
@GuardedBy("mLock")
- private void logContextCommittedLocked(@Nullable ArrayList<AutofillId> detectedFieldIds,
+ private void logContextCommittedLocked(
+ @Nullable ArrayList<AutofillId> detectedFieldIds,
@Nullable ArrayList<FieldClassification> detectedFieldClassifications,
@NoSaveReason int saveDialogNotShowReason,
@AutofillCommitReason int commitReason) {
if (sVerbose) {
- Slog.v(TAG, "logContextCommittedLocked (" + id + "): commit_reason:" + commitReason
- + " no_save_reason:" + saveDialogNotShowReason);
+ Slog.v(
+ TAG,
+ "logContextCommittedLocked ("
+ + id
+ + "): commit_reason:"
+ + commitReason
+ + " no_save_reason:"
+ + saveDialogNotShowReason);
}
final FillResponse lastResponse = getLastResponseLocked("logContextCommited(%s)");
if (lastResponse == null) return;
@@ -3423,8 +3713,11 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
final AutofillValue currentValue = viewState.getCurrentValue();
if (autofilledValue != null && autofilledValue.equals(currentValue)) {
if (sDebug) {
- Slog.d(TAG, "logContextCommitted(): ignoring changed " + viewState
- + " because it has same value that was autofilled");
+ Slog.d(
+ TAG,
+ "logContextCommitted(): ignoring changed "
+ + viewState
+ + " because it has same value that was autofilled");
}
continue;
}
@@ -3442,8 +3735,12 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
final AutofillValue currentValue = viewState.getCurrentValue();
if (currentValue == null) {
if (sDebug) {
- Slog.d(TAG, "logContextCommitted(): skipping view without current "
- + "value ( " + viewState + ")");
+ Slog.d(
+ TAG,
+ "logContextCommitted(): skipping view without current "
+ + "value ( "
+ + viewState
+ + ")");
}
continue;
}
@@ -3455,7 +3752,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
final List<Dataset> datasets = response.getDatasets();
if (datasets == null || datasets.isEmpty()) {
if (sVerbose) {
- Slog.v(TAG, "logContextCommitted() no datasets at " + j);
+ Slog.v(TAG, "logContextCommitted() no datasets at " + j);
}
} else {
for (int k = 0; k < datasets.size(); k++) {
@@ -3463,8 +3760,11 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
final String datasetId = dataset.getId();
if (datasetId == null) {
if (sVerbose) {
- Slog.v(TAG, "logContextCommitted() skipping idless "
- + "dataset " + dataset);
+ Slog.v(
+ TAG,
+ "logContextCommitted() skipping idless "
+ + "dataset "
+ + dataset);
}
} else {
final ArrayList<AutofillValue> values =
@@ -3473,9 +3773,13 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
final AutofillValue candidate = values.get(l);
if (currentValue.equals(candidate)) {
if (sDebug) {
- Slog.d(TAG, "field " + viewState.id + " was "
- + "manually filled with value set by "
- + "dataset " + datasetId);
+ Slog.d(
+ TAG,
+ "field "
+ + viewState.id
+ + " was manually filled with"
+ + " value set by dataset "
+ + datasetId);
}
if (manuallyFilledIds == null) {
manuallyFilledIds = new ArrayMap<>();
@@ -3524,10 +3828,20 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
}
- mService.logContextCommittedLocked(id, mClientState, mSelectedDatasetIds, ignoredDatasets,
- changedFieldIds, changedDatasetIds, manuallyFilledFieldIds,
- manuallyFilledDatasetIds, detectedFieldIds, detectedFieldClassifications,
- mComponentName, mCompatMode, saveDialogNotShowReason);
+ mService.logContextCommittedLocked(
+ id,
+ mClientState,
+ mSelectedDatasetIds,
+ ignoredDatasets,
+ changedFieldIds,
+ changedDatasetIds,
+ manuallyFilledFieldIds,
+ manuallyFilledDatasetIds,
+ detectedFieldIds,
+ detectedFieldClassifications,
+ mComponentName,
+ mCompatMode,
+ saveDialogNotShowReason);
mSessionCommittedEventLogger.maybeSetCommitReason(commitReason);
mSessionCommittedEventLogger.maybeSetRequestCount(mRequestCount);
mSaveEventLogger.maybeSetSaveUiNotShownReason(saveDialogNotShowReason);
@@ -3537,7 +3851,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
* Adds the matches to {@code detectedFieldsIds} and {@code detectedFieldClassifications} for
* {@code fieldId} based on its {@code currentValue} and {@code userData}.
*/
- private void logFieldClassificationScore(@NonNull FieldClassificationStrategy fcStrategy,
+ private void logFieldClassificationScore(
+ @NonNull FieldClassificationStrategy fcStrategy,
@NonNull FieldClassificationUserData userData,
@NoSaveReason int saveDialogNotShowReason,
@AutofillCommitReason int commitReason) {
@@ -3555,16 +3870,20 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
if (userValues == null || categoryIds == null || userValues.length != categoryIds.length) {
final int valuesLength = userValues == null ? -1 : userValues.length;
final int idsLength = categoryIds == null ? -1 : categoryIds.length;
- Slog.w(TAG, "setScores(): user data mismatch: values.length = "
- + valuesLength + ", ids.length = " + idsLength);
+ Slog.w(
+ TAG,
+ "setScores(): user data mismatch: values.length = "
+ + valuesLength
+ + ", ids.length = "
+ + idsLength);
return;
}
final int maxFieldsSize = UserData.getMaxFieldClassificationIdsSize();
final ArrayList<AutofillId> detectedFieldIds = new ArrayList<>(maxFieldsSize);
- final ArrayList<FieldClassification> detectedFieldClassifications = new ArrayList<>(
- maxFieldsSize);
+ final ArrayList<FieldClassification> detectedFieldClassifications =
+ new ArrayList<>(maxFieldsSize);
final Collection<ViewState> viewStates;
synchronized (mLock) {
@@ -3583,33 +3902,49 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
// Then use the results, asynchronously
- final RemoteCallback callback = new RemoteCallback(
- new LogFieldClassificationScoreOnResultListener(
- this,
- saveDialogNotShowReason,
- commitReason,
- viewsSize,
- autofillIds,
- userValues,
- categoryIds,
- detectedFieldIds,
- detectedFieldClassifications));
-
- fcStrategy.calculateScores(callback, currentValues, userValues, categoryIds,
- defaultAlgorithm, defaultArgs, algorithms, args);
- }
-
- void handleLogFieldClassificationScore(@Nullable Bundle result, int saveDialogNotShowReason,
- int commitReason, int viewsSize, AutofillId[] autofillIds, String[] userValues,
- String[] categoryIds, ArrayList<AutofillId> detectedFieldIds,
+ final RemoteCallback callback =
+ new RemoteCallback(
+ new LogFieldClassificationScoreOnResultListener(
+ this,
+ saveDialogNotShowReason,
+ commitReason,
+ viewsSize,
+ autofillIds,
+ userValues,
+ categoryIds,
+ detectedFieldIds,
+ detectedFieldClassifications));
+
+ fcStrategy.calculateScores(
+ callback,
+ currentValues,
+ userValues,
+ categoryIds,
+ defaultAlgorithm,
+ defaultArgs,
+ algorithms,
+ args);
+ }
+
+ void handleLogFieldClassificationScore(
+ @Nullable Bundle result,
+ int saveDialogNotShowReason,
+ int commitReason,
+ int viewsSize,
+ AutofillId[] autofillIds,
+ String[] userValues,
+ String[] categoryIds,
+ ArrayList<AutofillId> detectedFieldIds,
ArrayList<FieldClassification> detectedFieldClassifications) {
if (result == null) {
if (sDebug) Slog.d(TAG, "setFieldClassificationScore(): no results");
logContextCommitted(null, null, saveDialogNotShowReason, commitReason);
return;
}
- final Scores scores = result.getParcelable(EXTRA_SCORES,
- android.service.autofill.AutofillFieldClassificationService.Scores.class);
+ final Scores scores =
+ result.getParcelable(
+ EXTRA_SCORES,
+ android.service.autofill.AutofillFieldClassificationService.Scores.class);
if (scores == null) {
Slog.w(TAG, "No field classification score on " + result);
return;
@@ -3633,14 +3968,24 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
final Float currentScore = scoresByField.get(categoryId);
if (currentScore != null && currentScore > score) {
if (sVerbose) {
- Slog.v(TAG, "skipping score " + score
- + " because it's less than " + currentScore);
+ Slog.v(
+ TAG,
+ "skipping score "
+ + score
+ + " because it's less than "
+ + currentScore);
}
continue;
}
if (sVerbose) {
- Slog.v(TAG, "adding score " + score + " at index " + j + " and id "
- + autofillId);
+ Slog.v(
+ TAG,
+ "adding score "
+ + score
+ + " at index "
+ + j
+ + " and id "
+ + autofillId);
}
scoresByField.put(categoryId, score);
} else if (sVerbose) {
@@ -3666,13 +4011,16 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
wtf(e, "Error accessing FC score at [%d, %d] (%s): %s", i, j, scores, e);
return;
}
- logContextCommitted(detectedFieldIds, detectedFieldClassifications,
- saveDialogNotShowReason, commitReason);
+ logContextCommitted(
+ detectedFieldIds,
+ detectedFieldClassifications,
+ saveDialogNotShowReason,
+ commitReason);
}
/**
- * Generates a {@link android.service.autofill.FillEventHistory.Event#TYPE_SAVE_SHOWN}
- * when necessary.
+ * Generates a {@link android.service.autofill.FillEventHistory.Event#TYPE_SAVE_SHOWN} when
+ * necessary.
*
* <p>Note: It is necessary to call logContextCommitted() first before calling this method.
*/
@@ -3689,11 +4037,14 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
@NonNull
public SaveResult showSaveLocked() {
if (mDestroyed) {
- Slog.w(TAG, "Call to Session#showSaveLocked() rejected - session: "
- + id + " destroyed");
+ Slog.w(
+ TAG,
+ "Call to Session#showSaveLocked() rejected - session: " + id + " destroyed");
mSaveEventLogger.maybeSetSaveUiNotShownReason(NO_SAVE_REASON_SESSION_DESTROYED);
mSaveEventLogger.logAndEndEvent();
- return new SaveResult(/* logSaveShown= */ false, /* removeSession= */ false,
+ return new SaveResult(
+ /* logSaveShown= */ false,
+ /* removeSession= */ false,
Event.NO_SAVE_UI_REASON_NONE);
}
mSessionState = STATE_FINISHED;
@@ -3705,12 +4056,16 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
*/
if (mSessionFlags.mScreenHasCredmanField) {
if (sVerbose) {
- Slog.v(TAG, "Call to Session#showSaveLocked() rejected - "
- + "there is credman field in screen");
+ Slog.v(
+ TAG,
+ "Call to Session#showSaveLocked() rejected - "
+ + "there is credman field in screen");
}
mSaveEventLogger.maybeSetSaveUiNotShownReason(NO_SAVE_REASON_SCREEN_HAS_CREDMAN_FIELD);
mSaveEventLogger.logAndEndEvent();
- return new SaveResult(/* logSaveShown= */ false, /* removeSession= */ true,
+ return new SaveResult(
+ /* logSaveShown= */ false,
+ /* removeSession= */ true,
Event.NO_SAVE_UI_REASON_NONE);
}
@@ -3728,7 +4083,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
if (sVerbose) Slog.v(TAG, "showSaveLocked(" + this.id + "): no saveInfo from service");
mSaveEventLogger.maybeSetSaveUiNotShownReason(NO_SAVE_REASON_NO_SAVE_INFO);
mSaveEventLogger.logAndEndEvent();
- return new SaveResult(/* logSaveShown= */ false, /* removeSession= */ true,
+ return new SaveResult(
+ /* logSaveShown= */ false,
+ /* removeSession= */ true,
Event.NO_SAVE_UI_REASON_NO_SAVE_INFO);
}
@@ -3737,7 +4094,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
if (sDebug) Slog.v(TAG, "showSaveLocked(" + this.id + "): service asked to delay save");
mSaveEventLogger.maybeSetSaveUiNotShownReason(NO_SAVE_REASON_WITH_DELAY_SAVE_FLAG);
mSaveEventLogger.logAndEndEvent();
- return new SaveResult(/* logSaveShown= */ false, /* removeSession= */ false,
+ return new SaveResult(
+ /* logSaveShown= */ false,
+ /* removeSession= */ false,
Event.NO_SAVE_UI_REASON_WITH_DELAY_SAVE_FLAG);
}
@@ -3774,12 +4133,13 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
// Some apps clear the form before navigating to other activities.
// If current value is empty, consider fall back to last cached
// non-empty result first.
- final AutofillValue candidateSaveValue =
- viewState.getCandidateSaveValue();
+ final AutofillValue candidateSaveValue = viewState.getCandidateSaveValue();
if (candidateSaveValue != null && !candidateSaveValue.isEmpty()) {
if (sVerbose) {
- Slog.v(TAG, "current value is empty, using cached last non-empty "
- + "value instead");
+ Slog.v(
+ TAG,
+ "current value is empty, using cached last non-empty "
+ + "value instead");
}
value = candidateSaveValue;
} else {
@@ -3788,8 +4148,14 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
final AutofillValue initialValue = getValueFromContextsLocked(id);
if (initialValue != null) {
if (sDebug) {
- Slog.d(TAG, "Value of required field " + id + " didn't change; "
- + "using initial value (" + initialValue + ") instead");
+ Slog.d(
+ TAG,
+ "Value of required field "
+ + id
+ + " didn't change; "
+ + "using initial value ("
+ + initialValue
+ + ") instead");
}
value = initialValue;
} else {
@@ -3821,8 +4187,13 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
final AutofillValue initialValue = getValueFromContextsLocked(id);
if (initialValue != null && initialValue.equals(value)) {
if (sDebug) {
- Slog.d(TAG, "id " + id + " is part of dataset but initial value "
- + "didn't change: " + value);
+ Slog.d(
+ TAG,
+ "id "
+ + id
+ + " is part of dataset but initial value "
+ + "didn't change: "
+ + value);
}
changed = false;
} else {
@@ -3833,8 +4204,14 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
if (changed) {
if (sDebug) {
- Slog.d(TAG, "found a change on required " + id + ": " + filledValue
- + " => " + value);
+ Slog.d(
+ TAG,
+ "found a change on required "
+ + id
+ + ": "
+ + filledValue
+ + " => "
+ + value);
}
atLeastOneChanged = true;
}
@@ -3844,8 +4221,12 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
final AutofillId[] optionalIds = saveInfo.getOptionalIds();
if (sVerbose) {
- Slog.v(TAG, "allRequiredAreNotEmpty: " + allRequiredAreNotEmpty + " hasOptional: "
- + (optionalIds != null));
+ Slog.v(
+ TAG,
+ "allRequiredAreNotEmpty: "
+ + allRequiredAreNotEmpty
+ + " hasOptional: "
+ + (optionalIds != null));
}
int saveDialogNotShowReason;
if (!allRequiredAreNotEmpty) {
@@ -3859,7 +4240,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
// - if at least one required id changed but it was not part of a filled dataset, we
// need to check if an optional id is part of a filled datased (in which case we show
// Update instead of Save)
- if (optionalIds!= null && (!atLeastOneChanged || !isUpdate)) {
+ if (optionalIds != null && (!atLeastOneChanged || !isUpdate)) {
// No change on required ids yet, look for changes on optional ids.
for (int i = 0; i < optionalIds.length; i++) {
final AutofillId id = optionalIds[i];
@@ -3879,8 +4260,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
viewState.getCandidateSaveValue();
if (candidateSaveValue != null && !candidateSaveValue.isEmpty()) {
if (sVerbose) {
- Slog.v(TAG, "current value is empty, using cached last "
- + "non-empty value instead");
+ Slog.v(
+ TAG,
+ "current value is empty, using cached last "
+ + "non-empty value instead");
}
currentValue = candidateSaveValue;
}
@@ -3897,8 +4280,14 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
final AutofillValue filledValue = viewState.getAutofilledValue();
if (value != null && !value.equals(filledValue)) {
if (sDebug) {
- Slog.d(TAG, "found a change on optional " + id + ": " + filledValue
- + " => " + value);
+ Slog.d(
+ TAG,
+ "found a change on optional "
+ + id
+ + ": "
+ + filledValue
+ + " => "
+ + value);
}
if (filledValue != null) {
isUpdate = true;
@@ -3907,12 +4296,16 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
atLeastOneChanged = true;
}
- } else {
+ } else {
// Update current values cache based on initial value
final AutofillValue initialValue = getValueFromContextsLocked(id);
if (sDebug) {
- Slog.d(TAG, "no current value for " + id + "; initial value is "
- + initialValue);
+ Slog.d(
+ TAG,
+ "no current value for "
+ + id
+ + "; initial value is "
+ + initialValue);
}
if (initialValue != null) {
currentValues.put(id, initialValue);
@@ -3935,17 +4328,18 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
try {
isValid = validator.isValid(this);
if (sDebug) Slog.d(TAG, validator + " returned " + isValid);
- log.setType(isValid
- ? MetricsEvent.TYPE_SUCCESS
- : MetricsEvent.TYPE_DISMISS);
+ log.setType(
+ isValid ? MetricsEvent.TYPE_SUCCESS : MetricsEvent.TYPE_DISMISS);
} catch (Exception e) {
Slog.e(TAG, "Not showing save UI because validation failed:", e);
log.setType(MetricsEvent.TYPE_FAILURE);
mMetricsLogger.write(log);
mSaveEventLogger.maybeSetSaveUiNotShownReason(
- NO_SAVE_REASON_FIELD_VALIDATION_FAILED);
+ NO_SAVE_REASON_FIELD_VALIDATION_FAILED);
mSaveEventLogger.logAndEndEvent();
- return new SaveResult(/* logSaveShown= */ false, /* removeSession= */ true,
+ return new SaveResult(
+ /* logSaveShown= */ false,
+ /* removeSession= */ true,
Event.NO_SAVE_UI_REASON_FIELD_VALIDATION_FAILED);
}
@@ -3953,9 +4347,11 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
if (!isValid) {
Slog.i(TAG, "not showing save UI because fields failed validation");
mSaveEventLogger.maybeSetSaveUiNotShownReason(
- NO_SAVE_REASON_FIELD_VALIDATION_FAILED);
+ NO_SAVE_REASON_FIELD_VALIDATION_FAILED);
mSaveEventLogger.logAndEndEvent();
- return new SaveResult(/* logSaveShown= */ false, /* removeSession= */ true,
+ return new SaveResult(
+ /* logSaveShown= */ false,
+ /* removeSession= */ true,
Event.NO_SAVE_UI_REASON_FIELD_VALIDATION_FAILED);
}
}
@@ -3964,15 +4360,23 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
// content.
final List<Dataset> datasets = response.getDatasets();
if (datasets != null) {
- datasets_loop: for (int i = 0; i < datasets.size(); i++) {
+ datasets_loop:
+ for (int i = 0; i < datasets.size(); i++) {
final Dataset dataset = datasets.get(i);
final ArrayMap<AutofillId, AutofillValue> datasetValues =
Helper.getFields(dataset);
if (sVerbose) {
- Slog.v(TAG, "Checking if saved fields match contents of dataset #" + i
- + ": " + dataset + "; savableIds=" + savableIds);
+ Slog.v(
+ TAG,
+ "Checking if saved fields match contents of dataset #"
+ + i
+ + ": "
+ + dataset
+ + "; savableIds="
+ + savableIds);
}
- savable_ids_loop: for (int j = 0; j < savableIds.size(); j++) {
+ savable_ids_loop:
+ for (int j = 0; j < savableIds.size(); j++) {
final AutofillId id = savableIds.valueAt(j);
final AutofillValue currentValue = currentValues.get(id);
if (currentValue == null) {
@@ -3984,20 +4388,33 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
final AutofillValue datasetValue = datasetValues.get(id);
if (!currentValue.equals(datasetValue)) {
if (sDebug) {
- Slog.d(TAG, "found a dataset change on id " + id + ": from "
- + datasetValue + " to " + currentValue);
+ Slog.d(
+ TAG,
+ "found a dataset change on id "
+ + id
+ + ": from "
+ + datasetValue
+ + " to "
+ + currentValue);
}
continue datasets_loop;
}
if (sVerbose) Slog.v(TAG, "no dataset changes for id " + id);
}
if (sDebug) {
- Slog.d(TAG, "ignoring Save UI because all fields match contents of "
- + "dataset #" + i + ": " + dataset);
+ Slog.d(
+ TAG,
+ "ignoring Save UI because all fields match contents of "
+ + "dataset #"
+ + i
+ + ": "
+ + dataset);
}
mSaveEventLogger.maybeSetSaveUiNotShownReason(NO_SAVE_REASON_DATASET_MATCH);
mSaveEventLogger.logAndEndEvent();
- return new SaveResult(/* logSaveShown= */ false, /* removeSession= */ true,
+ return new SaveResult(
+ /* logSaveShown= */ false,
+ /* removeSession= */ true,
Event.NO_SAVE_UI_REASON_DATASET_MATCH);
}
}
@@ -4015,13 +4432,26 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
wtf(null, "showSaveLocked(): no service label or icon");
mSaveEventLogger.maybeSetSaveUiNotShownReason(NO_SAVE_REASON_NONE);
mSaveEventLogger.logAndEndEvent();
- return new SaveResult(/* logSaveShown= */ false, /* removeSession= */ true,
+ return new SaveResult(
+ /* logSaveShown= */ false,
+ /* removeSession= */ true,
Event.NO_SAVE_UI_REASON_NONE);
}
- getUiForShowing().showSaveUi(serviceLabel, serviceIcon,
- mService.getServicePackageName(), saveInfo, this,
- mComponentName, this, mContext, mPendingSaveUi, isUpdate, mCompatMode,
- response.getShowSaveDialogIcon(), mSaveEventLogger);
+ getUiForShowing()
+ .showSaveUi(
+ serviceLabel,
+ serviceIcon,
+ mService.getServicePackageName(),
+ saveInfo,
+ this,
+ mComponentName,
+ this,
+ mContext,
+ mPendingSaveUi,
+ isUpdate,
+ mCompatMode,
+ response.getShowSaveDialogIcon(),
+ mSaveEventLogger);
if (client != null) {
try {
client.setSaveUiState(id, true);
@@ -4031,21 +4461,30 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
mSessionFlags.mShowingSaveUi = true;
if (sDebug) {
- Slog.d(TAG, "Good news, everyone! All checks passed, show save UI for "
- + id + "!");
+ Slog.d(
+ TAG,
+ "Good news, everyone! All checks passed, show save UI for " + id + "!");
}
- return new SaveResult(/* logSaveShown= */ true, /* removeSession= */ false,
+ return new SaveResult(
+ /* logSaveShown= */ true,
+ /* removeSession= */ false,
Event.NO_SAVE_UI_REASON_NONE);
}
}
// Nothing changed...
if (sDebug) {
- Slog.d(TAG, "showSaveLocked(" + id +"): with no changes, comes no responsibilities."
- + "allRequiredAreNotNull=" + allRequiredAreNotEmpty
- + ", atLeastOneChanged=" + atLeastOneChanged);
+ Slog.d(
+ TAG,
+ "showSaveLocked("
+ + id
+ + "): with no changes, comes no responsibilities."
+ + "allRequiredAreNotNull="
+ + allRequiredAreNotEmpty
+ + ", atLeastOneChanged="
+ + atLeastOneChanged);
}
- return new SaveResult(/* logSaveShown= */ false, /* removeSession= */ true,
- saveDialogNotShowReason);
+ return new SaveResult(
+ /* logSaveShown= */ false, /* removeSession= */ true, saveDialogNotShowReason);
}
private void logSaveShown() {
@@ -4078,25 +4517,21 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
return sanitized;
}
- /**
- * Returns whether the session is currently showing the save UI
- */
+ /** Returns whether the session is currently showing the save UI */
@GuardedBy("mLock")
boolean isSaveUiShowingLocked() {
return mSessionFlags.mShowingSaveUi;
}
- /**
- * Gets the latest non-empty value for the given id in the autofill contexts.
- */
+ /** Gets the latest non-empty value for the given id in the autofill contexts. */
@GuardedBy("mLock")
@Nullable
private ViewNode getViewNodeFromContextsLocked(@NonNull AutofillId autofillId) {
final int numContexts = mContexts.size();
for (int i = numContexts - 1; i >= 0; i--) {
final FillContext context = mContexts.get(i);
- final ViewNode node = Helper.findViewNodeByAutofillId(context.getStructure(),
- autofillId);
+ final ViewNode node =
+ Helper.findViewNodeByAutofillId(context.getStructure(), autofillId);
if (node != null) {
return node;
}
@@ -4104,22 +4539,28 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
return null;
}
- /**
- * Gets the latest non-empty value for the given id in the autofill contexts.
- */
+ /** Gets the latest non-empty value for the given id in the autofill contexts. */
@GuardedBy("mLock")
@Nullable
private AutofillValue getValueFromContextsLocked(@NonNull AutofillId autofillId) {
final int numContexts = mContexts.size();
for (int i = numContexts - 1; i >= 0; i--) {
final FillContext context = mContexts.get(i);
- final ViewNode node = Helper.findViewNodeByAutofillId(context.getStructure(),
- autofillId);
+ final ViewNode node =
+ Helper.findViewNodeByAutofillId(context.getStructure(), autofillId);
if (node != null) {
final AutofillValue value = node.getAutofillValue();
if (sDebug) {
- Slog.d(TAG, "getValueFromContexts(" + this.id + "/" + autofillId + ") at "
- + i + ": " + value);
+ Slog.d(
+ TAG,
+ "getValueFromContexts("
+ + this.id
+ + "/"
+ + autofillId
+ + ") at "
+ + i
+ + ": "
+ + value);
}
if (value != null && !value.isEmpty()) {
return value;
@@ -4129,17 +4570,15 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
return null;
}
- /**
- * Gets the latest autofill options for the given id in the autofill contexts.
- */
+ /** Gets the latest autofill options for the given id in the autofill contexts. */
@GuardedBy("mLock")
@Nullable
private CharSequence[] getAutofillOptionsFromContextsLocked(@NonNull AutofillId autofillId) {
final int numContexts = mContexts.size();
for (int i = numContexts - 1; i >= 0; i--) {
final FillContext context = mContexts.get(i);
- final ViewNode node = Helper.findViewNodeByAutofillId(context.getStructure(),
- autofillId);
+ final ViewNode node =
+ Helper.findViewNodeByAutofillId(context.getStructure(), autofillId);
if (node != null && node.getAutofillOptions() != null) {
return node.getAutofillOptions();
}
@@ -4160,7 +4599,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
final FillContext context = mContexts.get(contextNum);
final ViewNode[] nodes =
- context.findViewNodesByAutofillIds(getIdsOfAllViewStatesLocked());
+ context.findViewNodesByAutofillIds(getIdsOfAllViewStatesLocked());
if (sVerbose) Slog.v(TAG, "updateValuesForSaveLocked(): updating " + context);
@@ -4191,8 +4630,11 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
if (sanitizedValue != null) {
node.updateAutofillValue(sanitizedValue);
} else if (sDebug) {
- Slog.d(TAG, "updateValuesForSaveLocked(): not updating field " + id
- + " because it failed sanitization");
+ Slog.d(
+ TAG,
+ "updateValuesForSaveLocked(): not updating field "
+ + id
+ + " because it failed sanitization");
}
}
@@ -4200,28 +4642,33 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
context.getStructure().sanitizeForParceling(false);
if (sVerbose) {
- Slog.v(TAG, "updateValuesForSaveLocked(): dumping structure of " + context
- + " before calling service.save()");
+ Slog.v(
+ TAG,
+ "updateValuesForSaveLocked(): dumping structure of "
+ + context
+ + " before calling service.save()");
context.getStructure().dump(false);
}
}
}
- /**
- * Calls service when user requested save.
- */
+ /** Calls service when user requested save. */
@GuardedBy("mLock")
void callSaveLocked() {
if (mDestroyed) {
- Slog.w(TAG, "Call to Session#callSaveLocked() rejected - session: "
- + id + " destroyed");
+ Slog.w(
+ TAG,
+ "Call to Session#callSaveLocked() rejected - session: " + id + " destroyed");
mSaveEventLogger.maybeSetIsSaved(false);
mSaveEventLogger.logAndEndEvent();
return;
}
if (mRemoteFillService == null) {
- wtf(null, "callSaveLocked() called without a remote service. "
- + "mForAugmentedAutofillOnly: %s", mSessionFlags.mAugmentedAutofillOnly);
+ wtf(
+ null,
+ "callSaveLocked() called without a remote service. "
+ + "mForAugmentedAutofillOnly: %s",
+ mSessionFlags.mAugmentedAutofillOnly);
mSaveEventLogger.maybeSetIsSaved(false);
mSaveEventLogger.logAndEndEvent();
return;
@@ -4241,7 +4688,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
// Remove pending fill requests as the session is finished.
cancelCurrentRequestLocked();
- final ArrayList<FillContext> contexts = mergePreviousSessionLocked( /* forSave= */ true);
+ final ArrayList<FillContext> contexts = mergePreviousSessionLocked(/* forSave= */ true);
FieldClassificationResponse fieldClassificationResponse =
mClassificationState.mLastFieldClassificationResponse;
@@ -4251,8 +4698,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
if (mClientState == null) {
mClientState = new Bundle();
}
- mClientState.putParcelableArrayList(EXTRA_KEY_DETECTIONS, new ArrayList<>(
- fieldClassificationResponse.getClassifications()));
+ mClientState.putParcelableArrayList(
+ EXTRA_KEY_DETECTIONS,
+ new ArrayList<>(fieldClassificationResponse.getClassifications()));
}
final SaveRequest saveRequest =
new SaveRequest(contexts, mClientState, mSelectedDatasetIds);
@@ -4270,11 +4718,12 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
* from previous sessions that were asked by the service to be delayed (if any).
*
* <p>As a side-effect:
+ *
* <ul>
- * <li>If the current {@link #mClientState} is {@code null}, sets it with the last non-
- * {@code null} client state from previous sessions.
+ * <li>If the current {@link #mClientState} is {@code null}, sets it with the last non- {@code
+ * null} client state from previous sessions.
* <li>When {@code forSave} is {@code true}, calls {@link #updateValuesForSaveLocked()} in the
- * previous sessions.
+ * previous sessions.
* </ul>
*/
@NonNull
@@ -4283,30 +4732,51 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
final ArrayList<FillContext> contexts;
if (previousSessions != null) {
if (sDebug) {
- Slog.d(TAG, "mergeSessions(" + this.id + "): Merging the content of "
- + previousSessions.size() + " sessions for task " + taskId);
+ Slog.d(
+ TAG,
+ "mergeSessions("
+ + this.id
+ + "): Merging the content of "
+ + previousSessions.size()
+ + " sessions for task "
+ + taskId);
}
contexts = new ArrayList<>();
for (int i = 0; i < previousSessions.size(); i++) {
final Session previousSession = previousSessions.get(i);
final ArrayList<FillContext> previousContexts = previousSession.mContexts;
if (previousContexts == null) {
- Slog.w(TAG, "mergeSessions(" + this.id + "): Not merging null contexts from "
- + previousSession.id);
+ Slog.w(
+ TAG,
+ "mergeSessions("
+ + this.id
+ + "): Not merging null contexts from "
+ + previousSession.id);
continue;
}
if (forSave) {
previousSession.updateValuesForSaveLocked();
}
if (sDebug) {
- Slog.d(TAG, "mergeSessions(" + this.id + "): adding " + previousContexts.size()
- + " context from previous session #" + previousSession.id);
+ Slog.d(
+ TAG,
+ "mergeSessions("
+ + this.id
+ + "): adding "
+ + previousContexts.size()
+ + " context from previous session #"
+ + previousSession.id);
}
contexts.addAll(previousContexts);
if (mClientState == null && previousSession.mClientState != null) {
if (sDebug) {
- Slog.d(TAG, "mergeSessions(" + this.id + "): setting client state from "
- + "previous session" + previousSession.id);
+ Slog.d(
+ TAG,
+ "mergeSessions("
+ + this.id
+ + "): setting client state from "
+ + "previous session"
+ + previousSession.id);
}
mClientState = previousSession.mClientState;
}
@@ -4351,8 +4821,12 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
// If it's not, then check if it should start a partition.
if (shouldStartNewPartitionLocked(id, flags)) {
if (sDebug) {
- Slog.d(TAG, "Starting partition or augmented request for view id " + id + ": "
- + viewState.getStateAsString());
+ Slog.d(
+ TAG,
+ "Starting partition or augmented request for view id "
+ + id
+ + ": "
+ + viewState.getStateAsString());
}
// Fix to always let standard autofill start.
// Sometimes activity contain IMPORTANT_FOR_AUTOFILL_NO fields which marks session as
@@ -4363,8 +4837,12 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
if (sVerbose) {
- Slog.v(TAG, "Not starting new partition for view " + id + ": "
- + viewState.getStateAsString());
+ Slog.v(
+ TAG,
+ "Not starting new partition for view "
+ + id
+ + ": "
+ + viewState.getStateAsString());
}
return Optional.empty();
}
@@ -4373,17 +4851,17 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
* Determines if a new partition should be started for an id.
*
* @param id The id of the view that is entered
- *
* @return {@code true} if a new partition should be started
*/
@GuardedBy("mLock")
private boolean shouldStartNewPartitionLocked(@NonNull AutofillId id, int flags) {
final ViewState currentView = mViewStates.get(id);
- SparseArray<FillResponse> responses = shouldRequestSecondaryProvider(flags)
- ? mSecondaryResponses : mResponses;
+ SparseArray<FillResponse> responses =
+ shouldRequestSecondaryProvider(flags) ? mSecondaryResponses : mResponses;
if (responses == null) {
- return currentView != null && (currentView.getState()
- & ViewState.STATE_PENDING_CREATE_INLINE_REQUEST) == 0;
+ return currentView != null
+ && (currentView.getState() & ViewState.STATE_PENDING_CREATE_INLINE_REQUEST)
+ == 0;
}
if (mSessionFlags.mExpiredResponse) {
@@ -4395,8 +4873,14 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
final int numResponses = responses.size();
if (numResponses >= AutofillManagerService.getPartitionMaxCount()) {
- Slog.e(TAG, "Not starting a new partition on " + id + " because session " + this.id
- + " reached maximum of " + AutofillManagerService.getPartitionMaxCount());
+ Slog.e(
+ TAG,
+ "Not starting a new partition on "
+ + id
+ + " because session "
+ + this.id
+ + " reached maximum of "
+ + AutofillManagerService.getPartitionMaxCount());
return false;
}
@@ -4437,8 +4921,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
boolean shouldRequestSecondaryProvider(int flags) {
- if (!mService.isAutofillCredmanIntegrationEnabled()
- || mSecondaryProviderHandler == null) {
+ if (!mService.isAutofillCredmanIntegrationEnabled() || mSecondaryProviderHandler == null) {
return false;
}
if (mIsPrimaryCredential) {
@@ -4452,8 +4935,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
// 'Session.this.mLock', which is the same as mLock.
@SuppressWarnings("GuardedBy")
@GuardedBy("mLock")
- void updateLocked(AutofillId id, Rect virtualBounds, AutofillValue value, int action,
- int flags) {
+ void updateLocked(
+ AutofillId id, Rect virtualBounds, AutofillValue value, int action, int flags) {
if (mDestroyed) {
Slog.w(TAG, "updateLocked(" + id + "): rejected - session: destroyed");
return;
@@ -4464,7 +4947,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
Slog.d(TAG, "updateLocked(" + id + "): Set the response has expired.");
}
mPresentationStatsEventLogger.maybeSetNoPresentationEventReasonIfNoReasonExists(
- NOT_SHOWN_REASON_VIEW_CHANGED);
+ NOT_SHOWN_REASON_VIEW_CHANGED);
mPresentationStatsEventLogger.logAndEndEvent("ACTION_RESPONSE_EXPIRED");
return;
}
@@ -4474,23 +4957,35 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
if (sVerbose) {
Slog.v(
TAG,
- "updateLocked(" + id + "): "
- + "id=" + this.id
- + ", action=" + actionAsString(action)
- + ", flags=" + flags
- + ", mCurrentViewId=" + mCurrentViewId
- + ", mExpiredResponse=" + mSessionFlags.mExpiredResponse
- + ", viewState=" + viewState);
+ "updateLocked("
+ + id
+ + "): "
+ + "id="
+ + this.id
+ + ", action="
+ + actionAsString(action)
+ + ", flags="
+ + flags
+ + ", mCurrentViewId="
+ + mCurrentViewId
+ + ", mExpiredResponse="
+ + mSessionFlags.mExpiredResponse
+ + ", viewState="
+ + viewState);
}
if (viewState == null) {
- if (action == ACTION_START_SESSION || action == ACTION_VALUE_CHANGED
+ if (action == ACTION_START_SESSION
+ || action == ACTION_VALUE_CHANGED
|| action == ACTION_VIEW_ENTERED) {
if (sVerbose) Slog.v(TAG, "Creating viewState for " + id);
boolean isIgnored = isIgnoredLocked(id);
- viewState = new ViewState(id, this,
- isIgnored ? ViewState.STATE_IGNORED : ViewState.STATE_INITIAL,
- mIsPrimaryCredential);
+ viewState =
+ new ViewState(
+ id,
+ this,
+ isIgnored ? ViewState.STATE_IGNORED : ViewState.STATE_INITIAL,
+ mIsPrimaryCredential);
mViewStates.put(id, viewState);
// TODO(b/73648631): for optimization purposes, should also ignore if change is
@@ -4521,7 +5016,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
mSessionFlags.mScreenHasCredmanField = true;
}
- switch(action) {
+ switch (action) {
case ACTION_START_SESSION:
// View is triggering autofill.
mCurrentViewId = viewState.id;
@@ -4545,14 +5040,14 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
case ACTION_VALUE_CHANGED:
if (mCompatMode && (viewState.getState() & ViewState.STATE_URL_BAR) != 0) {
// Must cancel the session if the value of the URL bar changed
- final String currentUrl = mUrlBar == null ? null
- : mUrlBar.getText().toString().trim();
+ final String currentUrl =
+ mUrlBar == null ? null : mUrlBar.getText().toString().trim();
if (currentUrl == null) {
// Validation check - shouldn't happen.
wtf(null, "URL bar value changed, but current value is null");
return;
}
- if (value == null || ! value.isText()) {
+ if (value == null || !value.isText()) {
// Validation check - shouldn't happen.
wtf(null, "URL bar value changed to null or non-text: %s", value);
return;
@@ -4567,8 +5062,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
// are finished, as the URL bar changed callback is usually called before
// the virtual views become invisible.
if (sDebug) {
- Slog.d(TAG, "Ignoring change on URL because session will finish when "
- + "views are gone");
+ Slog.d(
+ TAG,
+ "Ignoring change on URL because session will finish when "
+ + "views are gone");
}
return;
}
@@ -4598,8 +5095,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
// isSameViewEntered has some limitations, where it isn't considered same view when
// autofill suggestions pop up, user selects, and the focus lands back on the view.
// isSameViewAgain tries to overcome that situation.
- final boolean isSameViewAgain = isSameViewEntered
- || Objects.equals(mCurrentViewId, mPreviousNonNullEnteredViewId);
+ final boolean isSameViewAgain =
+ isSameViewEntered
+ || Objects.equals(mCurrentViewId, mPreviousNonNullEnteredViewId);
if (mCurrentViewId != null) {
mPreviousNonNullEnteredViewId = mCurrentViewId;
}
@@ -4655,8 +5153,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
// Trigger augmented autofill if applicable
if ((flags & FLAG_MANUAL_REQUEST) == 0) {
// Not a manual request
- if (mAugmentedAutofillableIds != null && mAugmentedAutofillableIds.contains(
- id)) {
+ if (mAugmentedAutofillableIds != null
+ && mAugmentedAutofillableIds.contains(id)) {
// Regular autofill handled the view and returned null response, but it
// triggered augmented autofill
if (!isSameViewEntered) {
@@ -4664,16 +5162,20 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
triggerAugmentedAutofillLocked(flags);
} else {
if (sDebug) {
- Slog.d(TAG, "skip augmented autofill for same view: "
- + "same view entered");
+ Slog.d(
+ TAG,
+ "skip augmented autofill for same view: "
+ + "same view entered");
}
}
return;
} else if (mSessionFlags.mAugmentedAutofillOnly && isSameViewEntered) {
// Regular autofill is disabled.
if (sDebug) {
- Slog.d(TAG, "skip augmented autofill for same view: "
- + "standard autofill disabled.");
+ Slog.d(
+ TAG,
+ "skip augmented autofill for same view: "
+ + "standard autofill disabled.");
}
return;
}
@@ -4717,8 +5219,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
// on the IME side if it arrives before the input view is finished on the IME.
mInlineSessionController.resetInlineFillUiLocked();
- if ((viewState.getState() &
- ViewState.STATE_PENDING_CREATE_INLINE_REQUEST) != 0) {
+ if ((viewState.getState() & ViewState.STATE_PENDING_CREATE_INLINE_REQUEST)
+ != 0) {
// View was exited before Inline Request sent back, do not set it to
// null yet to let onHandleAssistData finish processing
} else {
@@ -4728,7 +5230,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
// It's not necessary that there's no more presentation for this view. It could
// be that the user chose some suggestion, in which case, view exits.
mPresentationStatsEventLogger.maybeSetNoPresentationEventReason(
- NOT_SHOWN_REASON_VIEW_FOCUS_CHANGED);
+ NOT_SHOWN_REASON_VIEW_FOCUS_CHANGED);
}
break;
default:
@@ -4737,8 +5239,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
@GuardedBy("mLock")
- private void logPresentationStatsOnViewEnteredLocked(FillResponse response,
- boolean isCredmanRequested) {
+ private void logPresentationStatsOnViewEnteredLocked(
+ FillResponse response, boolean isCredmanRequested) {
mPresentationStatsEventLogger.maybeSetIsCredentialRequest(isCredmanRequested);
mPresentationStatsEventLogger.maybeSetFieldClassificationRequestId(
mFieldClassificationIdSnapshot);
@@ -4754,16 +5256,13 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
@GuardedBy("mLock")
private void hideAugmentedAutofillLocked(@NonNull ViewState viewState) {
- if ((viewState.getState()
- & ViewState.STATE_TRIGGERED_AUGMENTED_AUTOFILL) != 0) {
+ if ((viewState.getState() & ViewState.STATE_TRIGGERED_AUGMENTED_AUTOFILL) != 0) {
viewState.resetState(ViewState.STATE_TRIGGERED_AUGMENTED_AUTOFILL);
cancelAugmentedAutofillLocked();
}
}
- /**
- * Checks whether a view should be ignored.
- */
+ /** Checks whether a view should be ignored. */
@GuardedBy("mLock")
private boolean isIgnoredLocked(AutofillId id) {
// Always check the latest response only
@@ -4782,22 +5281,30 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
&& getSaveInfoLocked() != null) {
final int length = viewState.getCurrentValue().getTextValue().length();
if (sDebug) {
- Slog.d(TAG, "updateLocked(" + id + "): resetting value that was "
- + length + " chars long");
- }
- final LogMaker log = newLogMaker(MetricsEvent.AUTOFILL_VALUE_RESET)
- .addTaggedData(MetricsEvent.FIELD_AUTOFILL_PREVIOUS_LENGTH, length);
+ Slog.d(
+ TAG,
+ "updateLocked("
+ + id
+ + "): resetting value that was "
+ + length
+ + " chars long");
+ }
+ final LogMaker log =
+ newLogMaker(MetricsEvent.AUTOFILL_VALUE_RESET)
+ .addTaggedData(MetricsEvent.FIELD_AUTOFILL_PREVIOUS_LENGTH, length);
mMetricsLogger.write(log);
}
}
@GuardedBy("mLock")
- private void updateViewStateAndUiOnValueChangedLocked(AutofillId id, AutofillValue value,
- ViewState viewState, int flags) {
+ private void updateViewStateAndUiOnValueChangedLocked(
+ AutofillId id, AutofillValue value, ViewState viewState, int flags) {
// Cache the last non-empty value for save purpose. Some apps clear the form before
// navigating to other activities.
- if (mIgnoreViewStateResetToEmpty && (value == null || value.isEmpty())
- && viewState.getCurrentValue() != null && viewState.getCurrentValue().isText()
+ if (mIgnoreViewStateResetToEmpty
+ && (value == null || value.isEmpty())
+ && viewState.getCurrentValue() != null
+ && viewState.getCurrentValue().isText()
&& viewState.getCurrentValue().getTextValue() != null
&& viewState.getCurrentValue().getTextValue().length() > 1) {
if (sVerbose) {
@@ -4875,8 +5382,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
* indicate the IME attempting to probe the potentially sensitive content of inline suggestions.
*/
@GuardedBy("mLock")
- private void updateFilteringStateOnValueChangedLocked(@Nullable String newTextValue,
- ViewState viewState) {
+ private void updateFilteringStateOnValueChangedLocked(
+ @Nullable String newTextValue, ViewState viewState) {
if (newTextValue == null) {
// Don't just return here, otherwise the IME can circumvent this logic using non-text
// values.
@@ -4901,18 +5408,22 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
@Override
- public void onFillReady(@NonNull FillResponse response, @NonNull AutofillId filledId,
- @Nullable AutofillValue value, int flags) {
+ public void onFillReady(
+ @NonNull FillResponse response,
+ @NonNull AutofillId filledId,
+ @Nullable AutofillValue value,
+ int flags) {
synchronized (mLock) {
mPresentationStatsEventLogger.maybeSetFieldClassificationRequestId(
mFieldClassificationIdSnapshot);
if (mDestroyed) {
- Slog.w(TAG, "Call to Session#onFillReady() rejected - session: "
- + id + " destroyed");
+ Slog.w(
+ TAG,
+ "Call to Session#onFillReady() rejected - session: " + id + " destroyed");
mSaveEventLogger.maybeSetSaveUiNotShownReason(NO_SAVE_REASON_SESSION_DESTROYED);
mSaveEventLogger.logAndEndEvent();
mPresentationStatsEventLogger.maybeSetNoPresentationEventReason(
- NOT_SHOWN_REASON_SESSION_COMMITTED_PREMATURELY);
+ NOT_SHOWN_REASON_SESSION_COMMITTED_PREMATURELY);
mPresentationStatsEventLogger.logAndEndEvent("on fill ready");
return;
}
@@ -4954,7 +5465,6 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
} else {
setFillDialogDisabled();
}
-
}
if (response.supportsInlineSuggestions()) {
@@ -4971,10 +5481,20 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
}
- getUiForShowing().showFillUi(filledId, response, filterText,
- mService.getServicePackageName(), mComponentName,
- serviceLabel, serviceIcon, this, mContext, id, mCompatMode,
- mService.getMaster().getMaxInputLengthForAutofill());
+ getUiForShowing()
+ .showFillUi(
+ filledId,
+ response,
+ filterText,
+ mService.getServicePackageName(),
+ mComponentName,
+ serviceLabel,
+ serviceIcon,
+ this,
+ mContext,
+ id,
+ mCompatMode,
+ mService.getMaster().getMaxInputLengthForAutofill());
synchronized (mLock) {
if (mUiShownTime == 0) {
@@ -4983,21 +5503,26 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
final long duration = mUiShownTime - mStartTime;
if (sDebug) {
- final StringBuilder msg = new StringBuilder("1st UI for ")
- .append(mActivityToken)
- .append(" shown in ");
+ final StringBuilder msg =
+ new StringBuilder("1st UI for ")
+ .append(mActivityToken)
+ .append(" shown in ");
TimeUtils.formatDuration(duration, msg);
Slog.d(TAG, msg.toString());
}
- final StringBuilder historyLog = new StringBuilder("id=").append(id)
- .append(" app=").append(mActivityToken)
- .append(" svc=").append(mService.getServicePackageName())
- .append(" latency=");
+ final StringBuilder historyLog =
+ new StringBuilder("id=")
+ .append(id)
+ .append(" app=")
+ .append(mActivityToken)
+ .append(" svc=")
+ .append(mService.getServicePackageName())
+ .append(" latency=");
TimeUtils.formatDuration(duration, historyLog);
mUiLatencyHistory.log(historyLog.toString());
- addTaggedDataToRequestLogLocked(response.getRequestId(),
- MetricsEvent.FIELD_AUTOFILL_DURATION, duration);
+ addTaggedDataToRequestLogLocked(
+ response.getRequestId(), MetricsEvent.FIELD_AUTOFILL_DURATION, duration);
}
}
}
@@ -5052,8 +5577,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
}
- private boolean requestShowFillDialog(FillResponse response,
- AutofillId filledId, String filterText, int flags) {
+ private boolean requestShowFillDialog(
+ FillResponse response, AutofillId filledId, String filterText, int flags) {
if (!isFillDialogUiEnabled()) {
// Unsupported fill dialog UI
if (sDebug) Log.w(TAG, "requestShowFillDialog: fill dialog is disabled");
@@ -5079,7 +5604,6 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
if (sDebug) Log.w(TAG, "Last fill dialog triggered ids are changed.");
return false;
}
-
}
Drawable serviceIcon = null;
@@ -5087,21 +5611,31 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
serviceIcon = getServiceIcon(response);
}
- getUiForShowing().showFillDialog(filledId, response, filterText,
- mService.getServicePackageName(), mComponentName, serviceIcon, this,
- id, mCompatMode, mPresentationStatsEventLogger, mLock);
+ getUiForShowing()
+ .showFillDialog(
+ filledId,
+ response,
+ filterText,
+ mService.getServicePackageName(),
+ mComponentName,
+ serviceIcon,
+ this,
+ id,
+ mCompatMode,
+ mPresentationStatsEventLogger,
+ mLock);
return true;
}
/**
- * Get the custom icon that was passed through FillResponse. If the custom icon wasn't able
- * to be fetched, use the default provider icon instead
+ * Get the custom icon that was passed through FillResponse. If the custom icon wasn't able to
+ * be fetched, use the default provider icon instead
*
* @return Drawable of the provider icon, if it was able to be fetched. Null otherwise
*/
@SuppressWarnings("GuardedBy") // ErrorProne says we need to use mService.mLock, but it's
- // actually the same object as mLock.
- // TODO: Expose mService.mLock or redesign instead.
+ // actually the same object as mLock.
+ // TODO: Expose mService.mLock or redesign instead.
@GuardedBy("mLock")
private Drawable getServiceIcon(FillResponse response) {
Drawable serviceIcon = null;
@@ -5130,14 +5664,14 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
/**
- * Get the custom label that was passed through FillResponse. If the custom label
- * wasn't able to be fetched, use the default provider icon instead
+ * Get the custom label that was passed through FillResponse. If the custom label wasn't able to
+ * be fetched, use the default provider icon instead
*
* @return Drawable of the provider icon, if it was able to be fetched. Null otherwise
*/
@SuppressWarnings("GuardedBy") // ErrorProne says we need to use mService.mLock, but it's
- // actually the same object as mLock.
- // TODO: Expose mService.mLock or redesign instead.
+ // actually the same object as mLock.
+ // TODO: Expose mService.mLock or redesign instead.
@GuardedBy("mLock")
private CharSequence getServiceLabel(FillResponse response) {
CharSequence serviceLabel = null;
@@ -5167,11 +5701,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
return serviceLabel;
}
- /**
- * Returns whether we made a request to show inline suggestions.
- */
- private boolean requestShowInlineSuggestionsLocked(@NonNull FillResponse response,
- @Nullable String filterText) {
+ /** Returns whether we made a request to show inline suggestions. */
+ private boolean requestShowInlineSuggestionsLocked(
+ @NonNull FillResponse response, @Nullable String filterText) {
if (mCurrentViewId == null) {
Log.w(TAG, "requestShowInlineSuggestionsLocked(): no view currently focused");
return false;
@@ -5199,89 +5731,122 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
final InlineFillUi.InlineFillUiInfo inlineFillUiInfo =
- new InlineFillUi.InlineFillUiInfo(inlineSuggestionsRequest.get(), focusedId,
- filterText, remoteRenderService, userId, id);
- InlineFillUi inlineFillUi = InlineFillUi.forAutofill(inlineFillUiInfo, response,
- new InlineFillUi.InlineSuggestionUiCallback() {
- @Override
- public void autofill(@NonNull Dataset dataset, int datasetIndex) {
- fill(response.getRequestId(), datasetIndex, dataset, UI_TYPE_INLINE);
- }
+ new InlineFillUi.InlineFillUiInfo(
+ inlineSuggestionsRequest.get(),
+ focusedId,
+ filterText,
+ remoteRenderService,
+ userId,
+ id);
+ InlineFillUi inlineFillUi =
+ InlineFillUi.forAutofill(
+ inlineFillUiInfo,
+ response,
+ new InlineFillUi.InlineSuggestionUiCallback() {
+ @Override
+ public void autofill(@NonNull Dataset dataset, int datasetIndex) {
+ fill(
+ response.getRequestId(),
+ datasetIndex,
+ dataset,
+ UI_TYPE_INLINE);
+ }
- @Override
- public void authenticate(int requestId, int datasetIndex) {
- Session.this.authenticate(response.getRequestId(), datasetIndex,
- response.getAuthentication(), response.getClientState(),
- UI_TYPE_INLINE);
- }
+ @Override
+ public void authenticate(int requestId, int datasetIndex) {
+ Session.this.authenticate(
+ response.getRequestId(),
+ datasetIndex,
+ response.getAuthentication(),
+ response.getClientState(),
+ UI_TYPE_INLINE);
+ }
- @Override
- public void startIntentSender(@NonNull IntentSender intentSender) {
- Session.this.startIntentSender(intentSender, new Intent());
- }
+ @Override
+ public void startIntentSender(@NonNull IntentSender intentSender) {
+ Session.this.startIntentSender(intentSender, new Intent());
+ }
- @Override
- public void onError() {
- synchronized (mLock) {
- mInlineSessionController.setInlineFillUiLocked(
- InlineFillUi.emptyUi(focusedId));
- }
- }
+ @Override
+ public void onError() {
+ synchronized (mLock) {
+ mInlineSessionController.setInlineFillUiLocked(
+ InlineFillUi.emptyUi(focusedId));
+ }
+ }
- @Override
- public void onInflate() {
- Session.this.onShown(UI_TYPE_INLINE, 1);
- }
- }, mService.getMaster().getMaxInputLengthForAutofill());
+ @Override
+ public void onInflate() {
+ Session.this.onShown(UI_TYPE_INLINE, 1);
+ }
+ },
+ mService.getMaster().getMaxInputLengthForAutofill());
return mInlineSessionController.setInlineFillUiLocked(inlineFillUi);
}
private ResultReceiver constructCredentialManagerCallback(int requestId) {
- final ResultReceiver resultReceiver = new ResultReceiver(mHandler) {
- final AutofillId mAutofillId = mCurrentViewId;
- @Override
- protected void onReceiveResult(int resultCode, Bundle resultData) {
- if (resultCode == SUCCESS_CREDMAN_SELECTOR) {
- Slog.d(TAG, "onReceiveResult from Credential Manager "
- + "bottom sheet with mCurrentViewId: " + mAutofillId);
- GetCredentialResponse getCredentialResponse =
- resultData.getParcelable(
- CredentialProviderService.EXTRA_GET_CREDENTIAL_RESPONSE,
- GetCredentialResponse.class);
-
- if (Flags.autofillCredmanDevIntegration()) {
- sendCredentialManagerResponseToApp(getCredentialResponse,
- /*exception=*/ null, mAutofillId);
- } else {
- Dataset datasetFromCredential = getDatasetFromCredentialResponse(
- getCredentialResponse);
- if (datasetFromCredential != null) {
- autoFill(requestId, /*datasetIndex=*/-1,
- datasetFromCredential, false,
- UI_TYPE_CREDMAN_BOTTOM_SHEET);
+ final ResultReceiver resultReceiver =
+ new ResultReceiver(mHandler) {
+ final AutofillId mAutofillId = mCurrentViewId;
+
+ @Override
+ protected void onReceiveResult(int resultCode, Bundle resultData) {
+ if (resultCode == SUCCESS_CREDMAN_SELECTOR) {
+ Slog.d(
+ TAG,
+ "onReceiveResult from Credential Manager "
+ + "bottom sheet with mCurrentViewId: "
+ + mAutofillId);
+ GetCredentialResponse getCredentialResponse =
+ resultData.getParcelable(
+ CredentialProviderService.EXTRA_GET_CREDENTIAL_RESPONSE,
+ GetCredentialResponse.class);
+
+ if (Flags.autofillCredmanDevIntegration()) {
+ sendCredentialManagerResponseToApp(
+ getCredentialResponse, /* exception= */ null, mAutofillId);
+ } else {
+ Dataset datasetFromCredential =
+ getDatasetFromCredentialResponse(getCredentialResponse);
+ if (datasetFromCredential != null) {
+ autoFill(
+ requestId,
+ /* datasetIndex= */ -1,
+ datasetFromCredential,
+ false,
+ UI_TYPE_CREDMAN_BOTTOM_SHEET);
+ }
+ }
+ } else if (resultCode == FAILURE_CREDMAN_SELECTOR) {
+ String[] exception =
+ resultData.getStringArray(
+ CredentialProviderService
+ .EXTRA_GET_CREDENTIAL_EXCEPTION);
+ if (exception != null && exception.length >= 2) {
+ String errType = exception[0];
+ String errMsg = exception[1];
+ Slog.w(
+ TAG,
+ "Credman bottom sheet from pinned "
+ + "entry failed with: + "
+ + errType
+ + " , "
+ + errMsg);
+ sendCredentialManagerResponseToApp(
+ /* response= */ null,
+ new GetCredentialException(errType, errMsg),
+ mAutofillId);
+ }
+ } else {
+ Slog.d(
+ TAG,
+ "Unknown resultCode from credential "
+ + "manager bottom sheet: "
+ + resultCode);
}
}
- } else if (resultCode == FAILURE_CREDMAN_SELECTOR) {
- String[] exception = resultData.getStringArray(
- CredentialProviderService.EXTRA_GET_CREDENTIAL_EXCEPTION);
- if (exception != null && exception.length >= 2) {
- String errType = exception[0];
- String errMsg = exception[1];
- Slog.w(TAG, "Credman bottom sheet from pinned "
- + "entry failed with: + " + errType + " , "
- + errMsg);
- sendCredentialManagerResponseToApp(/*response=*/ null,
- new GetCredentialException(errType, errMsg),
- mAutofillId);
- }
- } else {
- Slog.d(TAG, "Unknown resultCode from credential "
- + "manager bottom sheet: " + resultCode);
- }
- }
- };
- ResultReceiver ipcFriendlyResultReceiver =
- toIpcFriendlyResultReceiver(resultReceiver);
+ };
+ ResultReceiver ipcFriendlyResultReceiver = toIpcFriendlyResultReceiver(resultReceiver);
return ipcFriendlyResultReceiver;
}
@@ -5309,8 +5874,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
}
- private void notifyUnavailableToClient(int sessionFinishedState,
- @Nullable ArrayList<AutofillId> autofillableIds) {
+ private void notifyUnavailableToClient(
+ int sessionFinishedState, @Nullable ArrayList<AutofillId> autofillableIds) {
synchronized (mLock) {
if (mCurrentViewId == null) return;
try {
@@ -5374,27 +5939,25 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
if (saveInfo.getRequiredIds() != null) {
Collections.addAll(trackedViews, saveInfo.getRequiredIds());
mSaveEventLogger.maybeSetSaveUiShownReason(
- SAVE_UI_SHOWN_REASON_REQUIRED_ID_CHANGE);
+ SAVE_UI_SHOWN_REASON_REQUIRED_ID_CHANGE);
}
if (saveInfo.getOptionalIds() != null) {
Collections.addAll(trackedViews, saveInfo.getOptionalIds());
mSaveEventLogger.maybeSetSaveUiShownReason(
- SAVE_UI_SHOWN_REASON_OPTIONAL_ID_CHANGE);
+ SAVE_UI_SHOWN_REASON_OPTIONAL_ID_CHANGE);
}
}
if ((flags & SaveInfo.FLAG_DONT_SAVE_ON_FINISH) != 0) {
- mSaveEventLogger.maybeSetSaveUiShownReason(
- SAVE_UI_SHOWN_REASON_UNKNOWN);
+ mSaveEventLogger.maybeSetSaveUiShownReason(SAVE_UI_SHOWN_REASON_UNKNOWN);
mSaveEventLogger.maybeSetSaveUiNotShownReason(
- NO_SAVE_REASON_WITH_DONT_SAVE_ON_FINISH_FLAG);
+ NO_SAVE_REASON_WITH_DONT_SAVE_ON_FINISH_FLAG);
saveOnFinish = false;
}
} else {
flags = 0;
- mSaveEventLogger.maybeSetSaveUiNotShownReason(
- NO_SAVE_REASON_NO_SAVE_INFO);
+ mSaveEventLogger.maybeSetSaveUiNotShownReason(NO_SAVE_REASON_NO_SAVE_INFO);
saveTriggerId = null;
}
@@ -5427,21 +5990,35 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
try {
if (sVerbose) {
- Slog.v(TAG, "updateTrackedIdsLocked(): trackedViews: " + trackedViews
- + " fillableIds: " + fillableIds + " triggerId: " + saveTriggerId
- + " saveOnFinish:" + saveOnFinish + " flags: " + flags
- + " hasSaveInfo: " + (saveInfo != null));
- }
- mClient.setTrackedViews(id, toArray(trackedViews), mSaveOnAllViewsInvisible,
- saveOnFinish, toArray(fillableIds), saveTriggerId, hasAuthentication);
+ Slog.v(
+ TAG,
+ "updateTrackedIdsLocked(): trackedViews: "
+ + trackedViews
+ + " fillableIds: "
+ + fillableIds
+ + " triggerId: "
+ + saveTriggerId
+ + " saveOnFinish:"
+ + saveOnFinish
+ + " flags: "
+ + flags
+ + " hasSaveInfo: "
+ + (saveInfo != null));
+ }
+ mClient.setTrackedViews(
+ id,
+ toArray(trackedViews),
+ mSaveOnAllViewsInvisible,
+ saveOnFinish,
+ toArray(fillableIds),
+ saveTriggerId,
+ hasAuthentication);
} catch (RemoteException e) {
Slog.w(TAG, "Cannot set tracked ids", e);
}
}
- /**
- * Sets the state of views that failed to autofill.
- */
+ /** Sets the state of views that failed to autofill. */
@GuardedBy("mLock")
void setAutofillFailureLocked(@NonNull List<AutofillId> ids, boolean isRefill) {
if (sVerbose && !ids.isEmpty()) {
@@ -5464,9 +6041,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
mPresentationStatsEventLogger.maybeSetViewFillFailureCounts(ids, isRefill);
}
- /**
- * Sets the state of views that failed to autofill.
- */
+ /** Sets the state of views that failed to autofill. */
@GuardedBy("mLock")
void setViewAutofilledLocked(@NonNull AutofillId id) {
if (sVerbose) {
@@ -5478,17 +6053,14 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
mPresentationStatsEventLogger.maybeAddSuccessId(id);
}
- /**
- * Sets the state of views that failed to autofill.
- */
+ /** Sets the state of views that failed to autofill. */
void setNotifyNotExpiringResponseDuringAuth() {
synchronized (mLock) {
mPresentationStatsEventLogger.maybeSetNotifyNotExpiringResponseDuringAuth();
}
}
- /**
- * Sets the state of views that failed to autofill.
- */
+
+ /** Sets the state of views that failed to autofill. */
void setLogViewEnteredIgnoredDuringAuth() {
synchronized (mLock) {
mPresentationStatsEventLogger.notifyViewEnteredIgnoredDuringAuthCount();
@@ -5496,10 +6068,15 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
@GuardedBy("mLock")
- private void replaceResponseLocked(@NonNull FillResponse oldResponse,
- @NonNull FillResponse newResponse, @Nullable Bundle newClientState) {
+ private void replaceResponseLocked(
+ @NonNull FillResponse oldResponse,
+ @NonNull FillResponse newResponse,
+ @Nullable Bundle newClientState) {
// Disassociate view states with the old response
- setViewStatesLocked(oldResponse, ViewState.STATE_INITIAL, /* clearResponse= */ true,
+ setViewStatesLocked(
+ oldResponse,
+ ViewState.STATE_INITIAL,
+ /* clearResponse= */ true,
/* isPrimary= */ true);
// Move over the id
newResponse.setRequestId(oldResponse.getRequestId());
@@ -5519,7 +6096,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
final ArrayList<AutofillId> autofillableIds;
if (context != null) {
final AssistStructure structure = context.getStructure();
- autofillableIds = Helper.getAutofillIds(structure, /* autofillableOnly= */true);
+ autofillableIds = Helper.getAutofillIds(structure, /* autofillableOnly= */ true);
} else {
Slog.w(TAG, "processNullResponseLocked(): no context for req " + requestId);
autofillableIds = null;
@@ -5535,8 +6112,13 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
mAugmentedAutofillDestroyer = triggerAugmentedAutofillLocked(flags);
if (mAugmentedAutofillDestroyer == null && ((flags & FLAG_PASSWORD_INPUT_TYPE) == 0)) {
if (sVerbose) {
- Slog.v(TAG, "canceling session " + id + " when service returned null and it cannot "
- + "be augmented. AutofillableIds: " + autofillableIds);
+ Slog.v(
+ TAG,
+ "canceling session "
+ + id
+ + " when service returned null and it cannot "
+ + "be augmented. AutofillableIds: "
+ + autofillableIds);
}
// Nothing to be done, but need to notify client.
notifyUnavailableToClient(AutofillManager.STATE_FINISHED, autofillableIds);
@@ -5544,15 +6126,25 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
} else {
if ((flags & FLAG_PASSWORD_INPUT_TYPE) != 0) {
if (sVerbose) {
- Slog.v(TAG, "keeping session " + id + " when service returned null and "
- + "augmented service is disabled for password fields. "
- + "AutofillableIds: " + autofillableIds);
+ Slog.v(
+ TAG,
+ "keeping session "
+ + id
+ + " when service returned null and "
+ + "augmented service is disabled for password fields. "
+ + "AutofillableIds: "
+ + autofillableIds);
}
mInlineSessionController.hideInlineSuggestionsUiLocked(mCurrentViewId);
} else {
if (sVerbose) {
- Slog.v(TAG, "keeping session " + id + " when service returned null but "
- + "it can be augmented. AutofillableIds: " + autofillableIds);
+ Slog.v(
+ TAG,
+ "keeping session "
+ + id
+ + " when service returned null but "
+ + "it can be augmented. AutofillableIds: "
+ + autofillableIds);
}
}
mAugmentedAutofillableIds = autofillableIds;
@@ -5567,8 +6159,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
/**
* Tries to trigger Augmented Autofill when the standard service could not fulfill a request.
*
- * <p> The request may not have been sent when this method returns as it may be waiting for
- * the inline suggestion request asynchronously.
+ * <p>The request may not have been sent when this method returns as it may be waiting for the
+ * inline suggestion request asynchronously.
*
* @return callback to destroy the autofill UI, or {@code null} if not supported.
*/
@@ -5582,8 +6174,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
// Check if Smart Suggestions is supported...
- final @SmartSuggestionMode int supportedModes = mService
- .getSupportedSmartSuggestionModesLocked();
+ final @SmartSuggestionMode int supportedModes =
+ mService.getSupportedSmartSuggestionModesLocked();
if (supportedModes == 0) {
if (sVerbose) Slog.v(TAG, "triggerAugmentedAutofillLocked(): no supported modes");
return null;
@@ -5591,8 +6183,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
// ...then if the service is set for the user
- final RemoteAugmentedAutofillService remoteService = mService
- .getRemoteAugmentedAutofillServiceLocked();
+ final RemoteAugmentedAutofillService remoteService =
+ mService.getRemoteAugmentedAutofillServiceLocked();
if (remoteService == null) {
if (sVerbose) Slog.v(TAG, "triggerAugmentedAutofillLocked(): no service for user");
return null;
@@ -5612,25 +6204,37 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
return null;
}
- final boolean isAllowlisted = mService
- .isWhitelistedForAugmentedAutofillLocked(mComponentName);
+ final boolean isAllowlisted =
+ mService.isWhitelistedForAugmentedAutofillLocked(mComponentName);
if (!isAllowlisted) {
if (sVerbose) {
- Slog.v(TAG, "triggerAugmentedAutofillLocked(): "
- + ComponentName.flattenToShortString(mComponentName) + " not whitelisted ");
- }
- logAugmentedAutofillRequestLocked(mode, remoteService.getComponentName(),
- mCurrentViewId, isAllowlisted, /* isInline= */ null);
+ Slog.v(
+ TAG,
+ "triggerAugmentedAutofillLocked(): "
+ + ComponentName.flattenToShortString(mComponentName)
+ + " not whitelisted ");
+ }
+ logAugmentedAutofillRequestLocked(
+ mode,
+ remoteService.getComponentName(),
+ mCurrentViewId,
+ isAllowlisted,
+ /* isInline= */ null);
return null;
}
if (sVerbose) {
- Slog.v(TAG, "calling Augmented Autofill Service ("
- + ComponentName.flattenToShortString(remoteService.getComponentName())
- + ") on view " + mCurrentViewId + " using suggestion mode "
- + getSmartSuggestionModeToString(mode)
- + " when server returned null for session " + this.id);
+ Slog.v(
+ TAG,
+ "calling Augmented Autofill Service ("
+ + ComponentName.flattenToShortString(remoteService.getComponentName())
+ + ") on view "
+ + mCurrentViewId
+ + " using suggestion mode "
+ + getSmartSuggestionModeToString(mode)
+ + " when server returned null for session "
+ + this.id);
}
// Log FillRequest for Augmented Autofill.
mFillRequestEventLogger.startLogForNewRequest();
@@ -5648,8 +6252,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
if (mAugmentedRequestsLogs == null) {
mAugmentedRequestsLogs = new ArrayList<>();
}
- final LogMaker log = newLogMaker(MetricsEvent.AUTOFILL_AUGMENTED_REQUEST,
- remoteService.getComponentName().getPackageName());
+ final LogMaker log =
+ newLogMaker(
+ MetricsEvent.AUTOFILL_AUGMENTED_REQUEST,
+ remoteService.getComponentName().getPackageName());
mAugmentedRequestsLogs.add(log);
final AutofillId focusedId = mCurrentViewId;
@@ -5715,8 +6321,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
synchronized (session.mLock) {
session.mInlineSessionController.onCreateInlineSuggestionsRequestLocked(
- mFocusedId, /*requestConsumer=*/ mRequestAugmentedAutofill,
- result);
+ mFocusedId, /* requestConsumer= */ mRequestAugmentedAutofill, result);
}
}
}
@@ -5741,19 +6346,17 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
mIsAllowlisted = isAllowlisted;
mMode = mode;
mCurrentValue = currentValue;
-
}
+
@Override
public void accept(InlineSuggestionsRequest inlineSuggestionsRequest) {
Session session = mSessionWeakRef.get();
- if (logIfSessionNull(
- session, "AugmentedAutofillInlineSuggestionRequestConsumer:")) {
+ if (logIfSessionNull(session, "AugmentedAutofillInlineSuggestionRequestConsumer:")) {
return;
}
session.onAugmentedAutofillInlineSuggestionAccept(
inlineSuggestionsRequest, mFocusedId, mIsAllowlisted, mMode, mCurrentValue);
-
}
}
@@ -5770,8 +6373,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
public Boolean apply(InlineFillUi inlineFillUi) {
Session session = mSessionWeakRef.get();
- if (logIfSessionNull(
- session, "AugmentedAutofillInlineSuggestionsResponseCallback:")) {
+ if (logIfSessionNull(session, "AugmentedAutofillInlineSuggestionsResponseCallback:")) {
return false;
}
@@ -5801,8 +6403,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
/**
- * If the session is null or has been destroyed, log the error msg, and return true.
- * This is a helper function intended to be called when de-referencing from a weak reference.
+ * If the session is null or has been destroyed, log the error msg, and return true. This is a
+ * helper function intended to be called when de-referencing from a weak reference.
+ *
* @param session
* @param logPrefix
* @return true if the session is null, false otherwise.
@@ -5830,15 +6433,25 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
synchronized (mLock) {
final RemoteAugmentedAutofillService remoteService =
mService.getRemoteAugmentedAutofillServiceLocked();
- logAugmentedAutofillRequestLocked(mode, remoteService.getComponentName(),
- focussedId, isAllowlisted, inlineSuggestionsRequest != null);
- remoteService.onRequestAutofillLocked(id, mClient,
- taskId, mComponentName, mActivityToken,
- AutofillId.withoutSession(focussedId), currentValue,
+ logAugmentedAutofillRequestLocked(
+ mode,
+ remoteService.getComponentName(),
+ focussedId,
+ isAllowlisted,
+ inlineSuggestionsRequest != null);
+ remoteService.onRequestAutofillLocked(
+ id,
+ mClient,
+ taskId,
+ mComponentName,
+ mActivityToken,
+ AutofillId.withoutSession(focussedId),
+ currentValue,
inlineSuggestionsRequest,
new AugmentedAutofillInlineSuggestionsResponseCallback(this),
new AugmentedAutofillErrorCallback(this),
- mService.getRemoteInlineSuggestionRenderServiceLocked(), userId);
+ mService.getRemoteInlineSuggestionRenderServiceLocked(),
+ userId);
}
}
@@ -5847,15 +6460,14 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
cancelAugmentedAutofillLocked();
// Also cancel augmented in IME
- mInlineSessionController.setInlineFillUiLocked(
- InlineFillUi.emptyUi(mCurrentViewId));
+ mInlineSessionController.setInlineFillUiLocked(InlineFillUi.emptyUi(mCurrentViewId));
}
}
@GuardedBy("mLock")
private void cancelAugmentedAutofillLocked() {
- final RemoteAugmentedAutofillService remoteService = mService
- .getRemoteAugmentedAutofillServiceLocked();
+ final RemoteAugmentedAutofillService remoteService =
+ mService.getRemoteAugmentedAutofillServiceLocked();
if (remoteService == null) {
Slog.w(TAG, "cancelAugmentedAutofillLocked(): no service for user");
return;
@@ -5865,8 +6477,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
@GuardedBy("mLock")
- private void processResponseLocked(@NonNull FillResponse newResponse,
- @Nullable Bundle newClientState, int flags) {
+ private void processResponseLocked(
+ @NonNull FillResponse newResponse, @Nullable Bundle newClientState, int flags) {
// Make sure we are hiding the UI which will be shown
// only if handling the current response requires it.
mUi.hideAll(this);
@@ -5878,9 +6490,18 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
final int requestId = newResponse.getRequestId();
if (sVerbose) {
- Slog.v(TAG, "processResponseLocked(): mCurrentViewId=" + mCurrentViewId
- + ",flags=" + flags + ", reqId=" + requestId + ", resp=" + newResponse
- + ",newClientState=" + newClientState);
+ Slog.v(
+ TAG,
+ "processResponseLocked(): mCurrentViewId="
+ + mCurrentViewId
+ + ",flags="
+ + flags
+ + ", reqId="
+ + requestId
+ + ", resp="
+ + newResponse
+ + ",newClientState="
+ + newClientState);
}
if (mResponses == null) {
@@ -5892,8 +6513,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
mResponses.put(requestId, newResponse);
mClientState = newClientState != null ? newClientState : newResponse.getClientState();
- boolean webviewRequestedCredman = newClientState != null && newClientState.getBoolean(
- WEBVIEW_REQUESTED_CREDENTIAL_KEY, false);
+ boolean webviewRequestedCredman =
+ newClientState != null
+ && newClientState.getBoolean(WEBVIEW_REQUESTED_CREDENTIAL_KEY, false);
List<Dataset> datasetList = newResponse.getDatasets();
mPresentationStatsEventLogger.maybeSetWebviewRequestedCredential(webviewRequestedCredman);
@@ -5901,7 +6523,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
mPresentationStatsEventLogger.maybeSetAvailableCount(datasetList, mCurrentViewId);
mFillResponseEventLogger.maybeSetDatasetsCountAfterPotentialPccFiltering(datasetList);
- setViewStatesLocked(newResponse, ViewState.STATE_FILLABLE, /* clearResponse= */ false,
+ setViewStatesLocked(
+ newResponse,
+ ViewState.STATE_FILLABLE,
+ /* clearResponse= */ false,
/* isPrimary= */ true);
updateFillDialogTriggerIdsLocked();
updateTrackedIdsLocked();
@@ -5914,12 +6539,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
currentView.maybeCallOnFillReady(flags);
}
- /**
- * Sets the state of all views in the given response.
- */
+ /** Sets the state of all views in the given response. */
@GuardedBy("mLock")
- private void setViewStatesLocked(FillResponse response, int state, boolean clearResponse,
- boolean isPrimary) {
+ private void setViewStatesLocked(
+ FillResponse response, int state, boolean clearResponse, boolean isPrimary) {
final List<Dataset> datasets = response.getDatasets();
if (datasets != null && !datasets.isEmpty()) {
for (int i = 0; i < datasets.size(); i++) {
@@ -5964,12 +6587,14 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
}
- /**
- * Sets the state and response of all views in the given dataset.
- */
+ /** Sets the state and response of all views in the given dataset. */
@GuardedBy("mLock")
- private void setViewStatesLocked(@Nullable FillResponse response, @NonNull Dataset dataset,
- int state, boolean clearResponse, boolean isPrimary) {
+ private void setViewStatesLocked(
+ @Nullable FillResponse response,
+ @NonNull Dataset dataset,
+ int state,
+ boolean clearResponse,
+ boolean isPrimary) {
final ArrayList<AutofillId> ids = dataset.getFieldIds();
final ArrayList<AutofillValue> values = dataset.getFieldValues();
for (int j = 0; j < ids.size(); j++) {
@@ -5989,10 +6614,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
@GuardedBy("mLock")
- private ViewState createOrUpdateViewStateLocked(@NonNull AutofillId id, int state,
- @Nullable AutofillValue value) {
+ private ViewState createOrUpdateViewStateLocked(
+ @NonNull AutofillId id, int state, @Nullable AutofillValue value) {
ViewState viewState = mViewStates.get(id);
- if (viewState != null) {
+ if (viewState != null) {
viewState.setState(state);
} else {
viewState = new ViewState(id, this, state, mIsPrimaryCredential);
@@ -6008,22 +6633,27 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
return viewState;
}
- void autoFill(int requestId, int datasetIndex, Dataset dataset, boolean generateEvent,
- int uiType) {
+ void autoFill(
+ int requestId, int datasetIndex, Dataset dataset, boolean generateEvent, int uiType) {
if (sDebug) {
- Slog.d(TAG, "autoFill(): requestId=" + requestId + "; datasetIdx=" + datasetIndex
- + "; dataset=" + dataset);
+ Slog.d(
+ TAG,
+ "autoFill(): requestId="
+ + requestId
+ + "; datasetIdx="
+ + datasetIndex
+ + "; dataset="
+ + dataset);
}
synchronized (mLock) {
if (mDestroyed) {
- Slog.w(TAG, "Call to Session#autoFill() rejected - session: "
- + id + " destroyed");
+ Slog.w(TAG, "Call to Session#autoFill() rejected - session: " + id + " destroyed");
return;
}
// Selected dataset id is logged regardless of authentication result.
mPresentationStatsEventLogger.maybeSetSelectedDatasetId(datasetIndex);
mPresentationStatsEventLogger.maybeSetSelectedDatasetPickReason(
- dataset.getEligibleReason());
+ dataset.getEligibleReason());
// Autofill it directly...
if (dataset.getAuthentication() == null) {
if (generateEvent) {
@@ -6039,10 +6669,14 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
// ...or handle authentication.
mService.logDatasetAuthenticationSelected(dataset.getId(), id, mClientState, uiType);
mPresentationStatsEventLogger.maybeSetAuthenticationType(
- AUTHENTICATION_TYPE_DATASET_AUTHENTICATION);
+ AUTHENTICATION_TYPE_DATASET_AUTHENTICATION);
// does not matter the value of isPrimary because null response won't be overridden.
- setViewStatesLocked(null, dataset, ViewState.STATE_WAITING_DATASET_AUTH,
- /* clearResponse= */ false, /* isPrimary= */ true);
+ setViewStatesLocked(
+ null,
+ dataset,
+ ViewState.STATE_WAITING_DATASET_AUTH,
+ /* clearResponse= */ false,
+ /* isPrimary= */ true);
final Intent fillInIntent;
if (dataset.getCredentialFillInIntent() != null && Flags.autofillCredmanIntegration()) {
Slog.d(TAG, "Setting credential fill intent");
@@ -6055,11 +6689,13 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
forceRemoveFromServiceLocked();
return;
}
- final int authenticationId = AutofillManager.makeAuthenticationId(requestId,
- datasetIndex);
- startAuthentication(authenticationId, dataset.getAuthentication(), fillInIntent,
- /* authenticateInline= */false);
-
+ final int authenticationId =
+ AutofillManager.makeAuthenticationId(requestId, datasetIndex);
+ startAuthentication(
+ authenticationId,
+ dataset.getAuthentication(),
+ fillInIntent,
+ /* authenticateInline= */ false);
}
}
@@ -6072,13 +6708,17 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
final FillContext context = getFillContextByRequestIdLocked(requestId);
if (context == null) {
- wtf(null, "createAuthFillInIntentLocked(): no FillContext. requestId=%d; mContexts=%s",
- requestId, mContexts);
+ wtf(
+ null,
+ "createAuthFillInIntentLocked(): no FillContext. requestId=%d; mContexts=%s",
+ requestId,
+ mContexts);
return null;
}
if (mLastInlineSuggestionsRequest != null
&& mLastInlineSuggestionsRequest.first == requestId) {
- fillInIntent.putExtra(AutofillManager.EXTRA_INLINE_SUGGESTIONS_REQUEST,
+ fillInIntent.putExtra(
+ AutofillManager.EXTRA_INLINE_SUGGESTIONS_REQUEST,
mLastInlineSuggestionsRequest.second);
}
fillInIntent.putExtra(AutofillManager.EXTRA_ASSIST_STRUCTURE, context.getStructure());
@@ -6121,12 +6761,15 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
}
- private void startAuthentication(int authenticationId, IntentSender intent,
- Intent fillInIntent, boolean authenticateInline) {
+ private void startAuthentication(
+ int authenticationId,
+ IntentSender intent,
+ Intent fillInIntent,
+ boolean authenticateInline) {
try {
synchronized (mLock) {
- mClient.authenticate(id, authenticationId, intent, fillInIntent,
- authenticateInline);
+ mClient.authenticate(
+ id, authenticationId, intent, fillInIntent, authenticateInline);
}
} catch (RemoteException e) {
Slog.e(TAG, "Error launching auth intent", e);
@@ -6139,22 +6782,18 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
* @hide
*/
static final class SaveResult {
- /**
- * Whether to record the save dialog has been shown.
- */
+ /** Whether to record the save dialog has been shown. */
private boolean mLogSaveShown;
- /**
- * Whether to remove the session.
- */
+ /** Whether to remove the session. */
private boolean mRemoveSession;
- /**
- * The reason why a save dialog was not shown.
- */
+ /** The reason why a save dialog was not shown. */
@NoSaveReason private int mSaveDialogNotShowReason;
- SaveResult(boolean logSaveShown, boolean removeSession,
+ SaveResult(
+ boolean logSaveShown,
+ boolean removeSession,
@NoSaveReason int saveDialogNotShowReason) {
mLogSaveShown = logSaveShown;
mRemoveSession = removeSession;
@@ -6218,15 +6857,19 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
@Override
public String toString() {
- return "SaveResult: [logSaveShown=" + mLogSaveShown
- + ", removeSession=" + mRemoveSession
- + ", saveDialogNotShowReason=" + mSaveDialogNotShowReason + "]";
+ return "SaveResult: [logSaveShown="
+ + mLogSaveShown
+ + ", removeSession="
+ + mRemoveSession
+ + ", saveDialogNotShowReason="
+ + mSaveDialogNotShowReason
+ + "]";
}
}
/**
- * Class maintaining the state of the requests to
- * {@link android.service.assist.classification.FieldClassificationService}.
+ * Class maintaining the state of the requests to {@link
+ * android.service.assist.classification.FieldClassificationService}.
*/
private static final class ClassificationState {
@@ -6234,18 +6877,16 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
* Initial state indicating that the request for classification hasn't been triggered yet.
*/
private static final int STATE_INITIAL = 1;
- /**
- * Assist request has been triggered, but awaiting response.
- */
+
+ /** Assist request has been triggered, but awaiting response. */
private static final int STATE_PENDING_ASSIST_REQUEST = 2;
- /**
- * Classification request has been triggered, but awaiting response.
- */
+
+ /** Classification request has been triggered, but awaiting response. */
private static final int STATE_PENDING_REQUEST = 3;
- /**
- * Classification response has been received.
- */
+
+ /** Classification response has been received. */
private static final int STATE_RESPONSE = 4;
+
/**
* Classification state has been invalidated, and the last response may no longer be valid.
* This could occur due to various reasons like views changing their layouts, becoming
@@ -6254,15 +6895,17 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
*/
private static final int STATE_INVALIDATED = 5;
- @IntDef(prefix = { "STATE_" }, value = {
- STATE_INITIAL,
- STATE_PENDING_ASSIST_REQUEST,
- STATE_PENDING_REQUEST,
- STATE_RESPONSE,
- STATE_INVALIDATED
- })
+ @IntDef(
+ prefix = {"STATE_"},
+ value = {
+ STATE_INITIAL,
+ STATE_PENDING_ASSIST_REQUEST,
+ STATE_PENDING_REQUEST,
+ STATE_RESPONSE,
+ STATE_INVALIDATED
+ })
@Retention(RetentionPolicy.SOURCE)
- @interface ClassificationRequestState{}
+ @interface ClassificationRequestState {}
@GuardedBy("mLock")
private @ClassificationRequestState int mState = STATE_INITIAL;
@@ -6284,8 +6927,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
/**
* Typically, there would be a 1:1 mapping. However, in certain cases, we may have a hint
- * being applicable to many types. An example of this being new/change password forms,
- * where you need to confirm the passward twice.
+ * being applicable to many types. An example of this being new/change password forms, where
+ * you need to confirm the passward twice.
*/
@GuardedBy("mLock")
private ArrayMap<String, Set<AutofillId>> mHintsToAutofillIdMap;
@@ -6317,8 +6960,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
/**
* Process the response received.
+ *
* @return true if the response was processed, false otherwise. If there wasn't any
- * response, yet this function was called, it would return false.
+ * response, yet this function was called, it would return false.
*/
@GuardedBy("mLock")
private boolean processResponse() {
@@ -6358,7 +7002,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
@GuardedBy("mLock")
- private static void processDetections(Set<String> detections, AutofillId id,
+ private static void processDetections(
+ Set<String> detections,
+ AutofillId id,
ArrayMap<String, Set<AutofillId>> currentMap) {
for (String detection : detections) {
Set<AutofillId> autofillIds;
@@ -6416,37 +7062,67 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
@Override
public String toString() {
return "ClassificationState: ["
- + "state=" + stateToString()
- + ", mPendingFieldClassificationRequest=" + mPendingFieldClassificationRequest
- + ", mLastFieldClassificationResponse=" + mLastFieldClassificationResponse
- + ", mClassificationHintsMap=" + mClassificationHintsMap
- + ", mClassificationGroupHintsMap=" + mClassificationGroupHintsMap
- + ", mHintsToAutofillIdMap=" + mHintsToAutofillIdMap
- + ", mGroupHintsToAutofillIdMap=" + mGroupHintsToAutofillIdMap
+ + "state="
+ + stateToString()
+ + ", mPendingFieldClassificationRequest="
+ + mPendingFieldClassificationRequest
+ + ", mLastFieldClassificationResponse="
+ + mLastFieldClassificationResponse
+ + ", mClassificationHintsMap="
+ + mClassificationHintsMap
+ + ", mClassificationGroupHintsMap="
+ + mClassificationGroupHintsMap
+ + ", mHintsToAutofillIdMap="
+ + mHintsToAutofillIdMap
+ + ", mGroupHintsToAutofillIdMap="
+ + mGroupHintsToAutofillIdMap
+ "]";
}
-
}
@Override
public String toString() {
- return "Session: [id=" + id + ", component=" + mComponentName
- + ", state=" + sessionStateAsString(mSessionState) + "]";
+ return "Session: [id="
+ + id
+ + ", component="
+ + mComponentName
+ + ", state="
+ + sessionStateAsString(mSessionState)
+ + "]";
}
@GuardedBy("mLock")
void dumpLocked(String prefix, PrintWriter pw) {
final String prefix2 = prefix + " ";
- pw.print(prefix); pw.print("id: "); pw.println(id);
- pw.print(prefix); pw.print("uid: "); pw.println(uid);
- pw.print(prefix); pw.print("taskId: "); pw.println(taskId);
- pw.print(prefix); pw.print("flags: "); pw.println(mFlags);
- pw.print(prefix); pw.print("displayId: "); pw.println(mContext.getDisplayId());
- pw.print(prefix); pw.print("state: "); pw.println(sessionStateAsString(mSessionState));
- pw.print(prefix); pw.print("mComponentName: "); pw.println(mComponentName);
- pw.print(prefix); pw.print("mActivityToken: "); pw.println(mActivityToken);
- pw.print(prefix); pw.print("mStartTime: "); pw.println(mStartTime);
- pw.print(prefix); pw.print("Time to show UI: ");
+ pw.print(prefix);
+ pw.print("id: ");
+ pw.println(id);
+ pw.print(prefix);
+ pw.print("uid: ");
+ pw.println(uid);
+ pw.print(prefix);
+ pw.print("taskId: ");
+ pw.println(taskId);
+ pw.print(prefix);
+ pw.print("flags: ");
+ pw.println(mFlags);
+ pw.print(prefix);
+ pw.print("displayId: ");
+ pw.println(mContext.getDisplayId());
+ pw.print(prefix);
+ pw.print("state: ");
+ pw.println(sessionStateAsString(mSessionState));
+ pw.print(prefix);
+ pw.print("mComponentName: ");
+ pw.println(mComponentName);
+ pw.print(prefix);
+ pw.print("mActivityToken: ");
+ pw.println(mActivityToken);
+ pw.print(prefix);
+ pw.print("mStartTime: ");
+ pw.println(mStartTime);
+ pw.print(prefix);
+ pw.print("Time to show UI: ");
if (mUiShownTime == 0) {
pw.println("N/A");
} else {
@@ -6454,41 +7130,67 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
pw.println();
}
final int requestLogsSizes = mRequestLogs.size();
- pw.print(prefix); pw.print("mSessionLogs: "); pw.println(requestLogsSizes);
+ pw.print(prefix);
+ pw.print("mSessionLogs: ");
+ pw.println(requestLogsSizes);
for (int i = 0; i < requestLogsSizes; i++) {
final int requestId = mRequestLogs.keyAt(i);
final LogMaker log = mRequestLogs.valueAt(i);
- pw.print(prefix2); pw.print('#'); pw.print(i); pw.print(": req=");
- pw.print(requestId); pw.print(", log=" ); dumpRequestLog(pw, log); pw.println();
+ pw.print(prefix2);
+ pw.print('#');
+ pw.print(i);
+ pw.print(": req=");
+ pw.print(requestId);
+ pw.print(", log=");
+ dumpRequestLog(pw, log);
+ pw.println();
}
- pw.print(prefix); pw.print("mResponses: ");
+ pw.print(prefix);
+ pw.print("mResponses: ");
if (mResponses == null) {
pw.println("null");
} else {
pw.println(mResponses.size());
for (int i = 0; i < mResponses.size(); i++) {
- pw.print(prefix2); pw.print('#'); pw.print(i);
- pw.print(' '); pw.println(mResponses.valueAt(i));
- }
- }
- pw.print(prefix); pw.print("mCurrentViewId: "); pw.println(mCurrentViewId);
- pw.print(prefix); pw.print("mDestroyed: "); pw.println(mDestroyed);
- pw.print(prefix); pw.print("mShowingSaveUi: "); pw.println(mSessionFlags.mShowingSaveUi);
- pw.print(prefix); pw.print("mPendingSaveUi: "); pw.println(mPendingSaveUi);
+ pw.print(prefix2);
+ pw.print('#');
+ pw.print(i);
+ pw.print(' ');
+ pw.println(mResponses.valueAt(i));
+ }
+ }
+ pw.print(prefix);
+ pw.print("mCurrentViewId: ");
+ pw.println(mCurrentViewId);
+ pw.print(prefix);
+ pw.print("mDestroyed: ");
+ pw.println(mDestroyed);
+ pw.print(prefix);
+ pw.print("mShowingSaveUi: ");
+ pw.println(mSessionFlags.mShowingSaveUi);
+ pw.print(prefix);
+ pw.print("mPendingSaveUi: ");
+ pw.println(mPendingSaveUi);
final int numberViews = mViewStates.size();
- pw.print(prefix); pw.print("mViewStates size: "); pw.println(mViewStates.size());
+ pw.print(prefix);
+ pw.print("mViewStates size: ");
+ pw.println(mViewStates.size());
for (int i = 0; i < numberViews; i++) {
- pw.print(prefix); pw.print("ViewState at #"); pw.println(i);
+ pw.print(prefix);
+ pw.print("ViewState at #");
+ pw.println(i);
mViewStates.valueAt(i).dump(prefix2, pw);
}
- pw.print(prefix); pw.print("mContexts: " );
+ pw.print(prefix);
+ pw.print("mContexts: ");
if (mContexts != null) {
int numContexts = mContexts.size();
for (int i = 0; i < numContexts; i++) {
FillContext context = mContexts.get(i);
- pw.print(prefix2); pw.print(context);
+ pw.print(prefix2);
+ pw.print(context);
if (sVerbose) {
pw.println("AssistStructure dumped at logcat)");
@@ -6500,43 +7202,62 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
pw.println("null");
}
- pw.print(prefix); pw.print("mHasCallback: "); pw.println(mHasCallback);
+ pw.print(prefix);
+ pw.print("mHasCallback: ");
+ pw.println(mHasCallback);
if (mClientState != null) {
- pw.print(prefix); pw.print("mClientState: "); pw.print(mClientState.getSize()); pw
- .println(" bytes");
- }
- pw.print(prefix); pw.print("mCompatMode: "); pw.println(mCompatMode);
- pw.print(prefix); pw.print("mUrlBar: ");
+ pw.print(prefix);
+ pw.print("mClientState: ");
+ pw.print(mClientState.getSize());
+ pw.println(" bytes");
+ }
+ pw.print(prefix);
+ pw.print("mCompatMode: ");
+ pw.println(mCompatMode);
+ pw.print(prefix);
+ pw.print("mUrlBar: ");
if (mUrlBar == null) {
pw.println("N/A");
} else {
- pw.print("id="); pw.print(mUrlBar.getAutofillId());
- pw.print(" domain="); pw.print(mUrlBar.getWebDomain());
- pw.print(" text="); Helper.printlnRedactedText(pw, mUrlBar.getText());
- }
- pw.print(prefix); pw.print("mSaveOnAllViewsInvisible: "); pw.println(
- mSaveOnAllViewsInvisible);
- pw.print(prefix); pw.print("mSelectedDatasetIds: "); pw.println(mSelectedDatasetIds);
+ pw.print("id=");
+ pw.print(mUrlBar.getAutofillId());
+ pw.print(" domain=");
+ pw.print(mUrlBar.getWebDomain());
+ pw.print(" text=");
+ Helper.printlnRedactedText(pw, mUrlBar.getText());
+ }
+ pw.print(prefix);
+ pw.print("mSaveOnAllViewsInvisible: ");
+ pw.println(mSaveOnAllViewsInvisible);
+ pw.print(prefix);
+ pw.print("mSelectedDatasetIds: ");
+ pw.println(mSelectedDatasetIds);
if (mSessionFlags.mAugmentedAutofillOnly) {
- pw.print(prefix); pw.println("For Augmented Autofill Only");
+ pw.print(prefix);
+ pw.println("For Augmented Autofill Only");
}
if (mSessionFlags.mFillDialogDisabled) {
- pw.print(prefix); pw.println("Fill Dialog disabled");
+ pw.print(prefix);
+ pw.println("Fill Dialog disabled");
}
if (mLastFillDialogTriggerIds != null) {
- pw.print(prefix); pw.println("Last Fill Dialog trigger ids: ");
+ pw.print(prefix);
+ pw.println("Last Fill Dialog trigger ids: ");
pw.println(mSelectedDatasetIds);
}
if (mAugmentedAutofillDestroyer != null) {
- pw.print(prefix); pw.println("has mAugmentedAutofillDestroyer");
+ pw.print(prefix);
+ pw.println("has mAugmentedAutofillDestroyer");
}
if (mAugmentedRequestsLogs != null) {
- pw.print(prefix); pw.print("number augmented requests: ");
+ pw.print(prefix);
+ pw.print("number augmented requests: ");
pw.println(mAugmentedRequestsLogs.size());
}
if (mAugmentedAutofillableIds != null) {
- pw.print(prefix); pw.print("mAugmentedAutofillableIds: ");
+ pw.print(prefix);
+ pw.print("mAugmentedAutofillableIds: ");
pw.println(mAugmentedAutofillableIds);
}
if (mRemoteFillService != null) {
@@ -6545,21 +7266,32 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
private static void dumpRequestLog(@NonNull PrintWriter pw, @NonNull LogMaker log) {
- pw.print("CAT="); pw.print(log.getCategory());
+ pw.print("CAT=");
+ pw.print(log.getCategory());
pw.print(", TYPE=");
final int type = log.getType();
switch (type) {
- case MetricsEvent.TYPE_SUCCESS: pw.print("SUCCESS"); break;
- case MetricsEvent.TYPE_FAILURE: pw.print("FAILURE"); break;
- case MetricsEvent.TYPE_CLOSE: pw.print("CLOSE"); break;
- default: pw.print("UNSUPPORTED");
- }
- pw.print('('); pw.print(type); pw.print(')');
- pw.print(", PKG="); pw.print(log.getPackageName());
- pw.print(", SERVICE="); pw.print(log
- .getTaggedData(MetricsEvent.FIELD_AUTOFILL_SERVICE));
- pw.print(", ORDINAL="); pw.print(log
- .getTaggedData(MetricsEvent.FIELD_AUTOFILL_REQUEST_ORDINAL));
+ case MetricsEvent.TYPE_SUCCESS:
+ pw.print("SUCCESS");
+ break;
+ case MetricsEvent.TYPE_FAILURE:
+ pw.print("FAILURE");
+ break;
+ case MetricsEvent.TYPE_CLOSE:
+ pw.print("CLOSE");
+ break;
+ default:
+ pw.print("UNSUPPORTED");
+ }
+ pw.print('(');
+ pw.print(type);
+ pw.print(')');
+ pw.print(", PKG=");
+ pw.print(log.getPackageName());
+ pw.print(", SERVICE=");
+ pw.print(log.getTaggedData(MetricsEvent.FIELD_AUTOFILL_SERVICE));
+ pw.print(", ORDINAL=");
+ pw.print(log.getTaggedData(MetricsEvent.FIELD_AUTOFILL_REQUEST_ORDINAL));
dumpNumericValue(pw, log, "FLAGS", MetricsEvent.FIELD_AUTOFILL_FLAGS);
dumpNumericValue(pw, log, "NUM_DATASETS", MetricsEvent.FIELD_AUTOFILL_NUM_DATASETS);
dumpNumericValue(pw, log, "UI_LATENCY", MetricsEvent.FIELD_AUTOFILL_DURATION);
@@ -6569,64 +7301,86 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
pw.print(", AUTH_STATUS=");
switch (authStatus) {
case MetricsEvent.AUTOFILL_AUTHENTICATED:
- pw.print("AUTHENTICATED"); break;
+ pw.print("AUTHENTICATED");
+ break;
case MetricsEvent.AUTOFILL_DATASET_AUTHENTICATED:
- pw.print("DATASET_AUTHENTICATED"); break;
+ pw.print("DATASET_AUTHENTICATED");
+ break;
case MetricsEvent.AUTOFILL_INVALID_AUTHENTICATION:
- pw.print("INVALID_AUTHENTICATION"); break;
+ pw.print("INVALID_AUTHENTICATION");
+ break;
case MetricsEvent.AUTOFILL_INVALID_DATASET_AUTHENTICATION:
- pw.print("INVALID_DATASET_AUTHENTICATION"); break;
- default: pw.print("UNSUPPORTED");
+ pw.print("INVALID_DATASET_AUTHENTICATION");
+ break;
+ default:
+ pw.print("UNSUPPORTED");
}
- pw.print('('); pw.print(authStatus); pw.print(')');
+ pw.print('(');
+ pw.print(authStatus);
+ pw.print(')');
}
- dumpNumericValue(pw, log, "FC_IDS",
- MetricsEvent.FIELD_AUTOFILL_NUM_FIELD_CLASSIFICATION_IDS);
- dumpNumericValue(pw, log, "COMPAT_MODE",
- MetricsEvent.FIELD_AUTOFILL_COMPAT_MODE);
+ dumpNumericValue(
+ pw, log, "FC_IDS", MetricsEvent.FIELD_AUTOFILL_NUM_FIELD_CLASSIFICATION_IDS);
+ dumpNumericValue(pw, log, "COMPAT_MODE", MetricsEvent.FIELD_AUTOFILL_COMPAT_MODE);
}
- private static void dumpNumericValue(@NonNull PrintWriter pw, @NonNull LogMaker log,
- @NonNull String field, int tag) {
+ private static void dumpNumericValue(
+ @NonNull PrintWriter pw, @NonNull LogMaker log, @NonNull String field, int tag) {
final int value = getNumericValue(log, tag);
if (value != 0) {
- pw.print(", "); pw.print(field); pw.print('='); pw.print(value);
+ pw.print(", ");
+ pw.print(field);
+ pw.print('=');
+ pw.print(value);
}
}
- void sendCredentialManagerResponseToApp(@Nullable GetCredentialResponse response,
- @Nullable GetCredentialException exception, @NonNull AutofillId viewId) {
+ void sendCredentialManagerResponseToApp(
+ @Nullable GetCredentialResponse response,
+ @Nullable GetCredentialException exception,
+ @NonNull AutofillId viewId) {
synchronized (mLock) {
if (mDestroyed) {
- Slog.w(TAG, "Call to Session#sendCredentialManagerResponseToApp() rejected "
- + "- session: " + id + " destroyed");
+ Slog.w(
+ TAG,
+ "Call to Session#sendCredentialManagerResponseToApp() rejected "
+ + "- session: "
+ + id
+ + " destroyed");
return;
}
try {
final ViewState viewState = mViewStates.get(viewId);
if (mService.getMaster().getIsFillFieldsFromCurrentSessionOnly()
- && viewState != null && viewState.id.getSessionId() != id) {
+ && viewState != null
+ && viewState.id.getSessionId() != id) {
if (sVerbose) {
- Slog.v(TAG, "Skipping sending credential response to view: "
- + viewId + " as it isn't part of the current session: " + id);
+ Slog.v(
+ TAG,
+ "Skipping sending credential response to view: "
+ + viewId
+ + " as it isn't part of the current session: "
+ + id);
}
}
if (exception != null) {
if (viewId.isVirtualInt()) {
- sendResponseToViewNode(viewId, /*response=*/ null, exception);
+ sendResponseToViewNode(viewId, /* response= */ null, exception);
} else {
- mClient.onGetCredentialException(id, viewId, exception.getType(),
- exception.getMessage());
+ mClient.onGetCredentialException(
+ id, viewId, exception.getType(), exception.getMessage());
}
} else if (response != null) {
if (viewId.isVirtualInt()) {
- sendResponseToViewNode(viewId, response, /*exception=*/ null);
+ sendResponseToViewNode(viewId, response, /* exception= */ null);
} else {
mClient.onGetCredentialResponse(id, viewId, response);
}
} else {
- Slog.w(TAG, "sendCredentialManagerResponseToApp called with null response"
- + "and exception");
+ Slog.w(
+ TAG,
+ "sendCredentialManagerResponseToApp called with null response"
+ + "and exception");
}
} catch (RemoteException e) {
Slog.w(TAG, "Error sending credential response to activity: " + e);
@@ -6635,23 +7389,20 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
@GuardedBy("mLock")
- private void sendResponseToViewNode(AutofillId viewId, GetCredentialResponse response,
- GetCredentialException exception) {
+ private void sendResponseToViewNode(
+ AutofillId viewId, GetCredentialResponse response, GetCredentialException exception) {
ViewNode viewNode = getViewNodeFromContextsLocked(viewId);
if (viewNode != null && viewNode.getPendingCredentialCallback() != null) {
Bundle resultData = new Bundle();
if (response != null) {
resultData.putParcelable(
- CredentialProviderService.EXTRA_GET_CREDENTIAL_RESPONSE,
- response);
- viewNode.getPendingCredentialCallback().send(SUCCESS_CREDMAN_SELECTOR,
- resultData);
+ CredentialProviderService.EXTRA_GET_CREDENTIAL_RESPONSE, response);
+ viewNode.getPendingCredentialCallback().send(SUCCESS_CREDMAN_SELECTOR, resultData);
} else if (exception != null) {
resultData.putStringArray(
CredentialProviderService.EXTRA_GET_CREDENTIAL_EXCEPTION,
new String[] {exception.getType(), exception.getMessage()});
- viewNode.getPendingCredentialCallback().send(FAILURE_CREDMAN_SELECTOR,
- resultData);
+ viewNode.getPendingCredentialCallback().send(FAILURE_CREDMAN_SELECTOR, resultData);
}
} else {
Slog.w(TAG, "View node not found after GetCredentialResponse");
@@ -6661,8 +7412,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
void autoFillApp(Dataset dataset) {
synchronized (mLock) {
if (mDestroyed) {
- Slog.w(TAG, "Call to Session#autoFillApp() rejected - session: "
- + id + " destroyed");
+ Slog.w(
+ TAG,
+ "Call to Session#autoFillApp() rejected - session: " + id + " destroyed");
return;
}
try {
@@ -6671,8 +7423,11 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
final List<AutofillId> ids = new ArrayList<>(entryCount);
final List<AutofillValue> values = new ArrayList<>(entryCount);
boolean waitingDatasetAuth = false;
- boolean hideHighlight = (entryCount == 1
- && dataset.getFieldIds().get(0).equals(mCurrentViewId));
+ boolean hideHighlight =
+ highlightAutofillSingleField()
+ ? false
+ : (entryCount == 1
+ && dataset.getFieldIds().get(0).equals(mCurrentViewId));
// Count how many views are filtered because they are not in current session
int numOfViewsFiltered = 0;
for (int i = 0; i < entryCount; i++) {
@@ -6682,10 +7437,15 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
final AutofillId viewId = dataset.getFieldIds().get(i);
final ViewState viewState = mViewStates.get(viewId);
if (mService.getMaster().getIsFillFieldsFromCurrentSessionOnly()
- && viewState != null && viewState.id.getSessionId() != id) {
+ && viewState != null
+ && viewState.id.getSessionId() != id) {
if (sVerbose) {
- Slog.v(TAG, "Skipping filling view: " +
- viewId + " as it isn't part of the current session: " + id);
+ Slog.v(
+ TAG,
+ "Skipping filling view: "
+ + viewId
+ + " as it isn't part of the current session: "
+ + id);
}
numOfViewsFiltered += 1;
continue;
@@ -6721,8 +7481,12 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
// does not matter the value of isPrimary because null response won't be
// overridden.
- setViewStatesLocked(null, dataset, ViewState.STATE_AUTOFILLED,
- /* clearResponse= */ false, /* isPrimary= */ true);
+ setViewStatesLocked(
+ null,
+ dataset,
+ ViewState.STATE_AUTOFILLED,
+ /* clearResponse= */ false,
+ /* isPrimary= */ true);
}
} catch (RemoteException e) {
Slog.w(TAG, "Error autofilling activity: " + e);
@@ -6750,7 +7514,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
mSessionCommittedEventLogger.maybeSetCommitReason(val);
mSessionCommittedEventLogger.maybeSetRequestCount(mRequestCount);
mSessionCommittedEventLogger.maybeSetSessionDurationMillis(
- SystemClock.elapsedRealtime() - mStartTime);
+ SystemClock.elapsedRealtime() - mStartTime);
mFillRequestEventLogger.logAndEndEvent();
mFillResponseEventLogger.logAndEndEvent();
mPresentationStatsEventLogger.logAndEndEvent("log all events");
@@ -6808,8 +7572,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
}
- final int totalAugmentedRequests = mAugmentedRequestsLogs == null ? 0
- : mAugmentedRequestsLogs.size();
+ final int totalAugmentedRequests =
+ mAugmentedRequestsLogs == null ? 0 : mAugmentedRequestsLogs.size();
if (totalAugmentedRequests > 0) {
if (sVerbose) {
Slog.v(TAG, "destroyLocked(): logging " + totalRequests + " augmented requests");
@@ -6820,11 +7584,12 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
}
- final LogMaker log = newLogMaker(MetricsEvent.AUTOFILL_SESSION_FINISHED)
- .addTaggedData(MetricsEvent.FIELD_AUTOFILL_NUMBER_REQUESTS, totalRequests);
+ final LogMaker log =
+ newLogMaker(MetricsEvent.AUTOFILL_SESSION_FINISHED)
+ .addTaggedData(MetricsEvent.FIELD_AUTOFILL_NUMBER_REQUESTS, totalRequests);
if (totalAugmentedRequests > 0) {
- log.addTaggedData(MetricsEvent.FIELD_AUTOFILL_NUMBER_AUGMENTED_REQUESTS,
- totalAugmentedRequests);
+ log.addTaggedData(
+ MetricsEvent.FIELD_AUTOFILL_NUMBER_AUGMENTED_REQUESTS, totalAugmentedRequests);
}
if (mSessionFlags.mAugmentedAutofillOnly) {
log.addTaggedData(MetricsEvent.FIELD_AUTOFILL_AUGMENTED_ONLY, 1);
@@ -6846,8 +7611,12 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
@GuardedBy("mLock")
void forceRemoveFromServiceIfForAugmentedOnlyLocked() {
if (sVerbose) {
- Slog.v(TAG, "forceRemoveFromServiceIfForAugmentedOnlyLocked(" + this.id + "): "
- + mSessionFlags.mAugmentedAutofillOnly);
+ Slog.v(
+ TAG,
+ "forceRemoveFromServiceIfForAugmentedOnlyLocked("
+ + this.id
+ + "): "
+ + mSessionFlags.mAugmentedAutofillOnly);
}
if (!mSessionFlags.mAugmentedAutofillOnly) return;
@@ -6880,9 +7649,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
}
- /**
- * Thread-safe version of {@link #removeFromServiceLocked()}.
- */
+ /** Thread-safe version of {@link #removeFromServiceLocked()}. */
private void removeFromService() {
synchronized (mLock) {
removeFromServiceLocked();
@@ -6897,8 +7664,11 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
void removeFromServiceLocked() {
if (sVerbose) Slog.v(TAG, "removeFromServiceLocked(" + this.id + "): " + mPendingSaveUi);
if (mDestroyed) {
- Slog.w(TAG, "Call to Session#removeFromServiceLocked() rejected - session: "
- + id + " destroyed");
+ Slog.w(
+ TAG,
+ "Call to Session#removeFromServiceLocked() rejected - session: "
+ + id
+ + " destroyed");
return;
}
if (isSaveUiPendingLocked()) {
@@ -6922,18 +7692,16 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
/**
- * Checks whether this session is hiding the Save UI to handle a custom description link for
- * a specific {@code token} created by
- * {@link PendingUi#PendingUi(IBinder, int, IAutoFillManagerClient)}.
+ * Checks whether this session is hiding the Save UI to handle a custom description link for a
+ * specific {@code token} created by {@link PendingUi#PendingUi(IBinder, int,
+ * IAutoFillManagerClient)}.
*/
@GuardedBy("mLock")
boolean isSaveUiPendingForTokenLocked(@NonNull IBinder token) {
return isSaveUiPendingLocked() && token.equals(mPendingSaveUi.getToken());
}
- /**
- * Checks whether this session is hiding the Save UI to handle a custom description link.
- */
+ /** Checks whether this session is hiding the Save UI to handle a custom description link. */
@GuardedBy("mLock")
private boolean isSaveUiPendingLocked() {
return mPendingSaveUi != null && mPendingSaveUi.getState() == PendingUi.STATE_PENDING;
@@ -6942,8 +7710,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
// Return latest response index in mResponses SparseArray.
@GuardedBy("mLock")
private int getLastResponseIndexLocked() {
- if (mResponses == null || mResponses.size() == 0) {
- return -1;
+ if (mResponses == null || mResponses.size() == 0) {
+ return -1;
}
List<Integer> requestIdList = new ArrayList<>();
final int responseCount = mResponses.size();
@@ -6967,15 +7735,16 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
@GuardedBy("mLock")
private void logAuthenticationStatusLocked(int requestId, int status) {
- addTaggedDataToRequestLogLocked(requestId,
- MetricsEvent.FIELD_AUTOFILL_AUTHENTICATION_STATUS, status);
+ addTaggedDataToRequestLogLocked(
+ requestId, MetricsEvent.FIELD_AUTOFILL_AUTHENTICATION_STATUS, status);
}
@GuardedBy("mLock")
private void addTaggedDataToRequestLogLocked(int requestId, int tag, @Nullable Object value) {
final LogMaker requestLog = mRequestLogs.get(requestId);
if (requestLog == null) {
- Slog.w(TAG,
+ Slog.w(
+ TAG,
"addTaggedDataToRequestLogLocked(tag=" + tag + "): no log for id " + requestId);
return;
}
@@ -6983,20 +7752,33 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
@GuardedBy("mLock")
- private void logAugmentedAutofillRequestLocked(int mode,
- ComponentName augmentedRemoteServiceName, AutofillId focusedId, boolean isWhitelisted,
+ private void logAugmentedAutofillRequestLocked(
+ int mode,
+ ComponentName augmentedRemoteServiceName,
+ AutofillId focusedId,
+ boolean isWhitelisted,
Boolean isInline) {
final String historyItem =
- "aug:id=" + id + " u=" + uid + " m=" + mode
- + " a=" + ComponentName.flattenToShortString(mComponentName)
- + " f=" + focusedId
- + " s=" + augmentedRemoteServiceName
- + " w=" + isWhitelisted
- + " i=" + isInline;
+ "aug:id="
+ + id
+ + " u="
+ + uid
+ + " m="
+ + mode
+ + " a="
+ + ComponentName.flattenToShortString(mComponentName)
+ + " f="
+ + focusedId
+ + " s="
+ + augmentedRemoteServiceName
+ + " w="
+ + isWhitelisted
+ + " i="
+ + isInline;
mService.getMaster().logRequestLocked(historyItem);
}
- private void wtf(@Nullable Exception e, String fmt, Object...args) {
+ private void wtf(@Nullable Exception e, String fmt, Object... args) {
final String message = String.format(fmt, args);
synchronized (mLock) {
mWtfHistory.log(message);
@@ -7051,13 +7833,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
mClassificationState.updateResponseReceived(response);
}
- public void onClassificationRequestFailure(int requestId, @Nullable CharSequence message) {
+ public void onClassificationRequestFailure(int requestId, @Nullable CharSequence message) {}
- }
-
- public void onClassificationRequestTimeout(int requestId) {
-
- }
+ public void onClassificationRequestTimeout(int requestId) {}
@Override
public void onServiceDied(@NonNull RemoteFieldClassificationService service) {
@@ -7070,12 +7848,12 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
@Override
public void logFieldClassificationEvent(
- long startTime, FieldClassificationResponse response,
+ long startTime,
+ FieldClassificationResponse response,
@FieldClassificationEventLogger.FieldClassificationStatus int status) {
final FieldClassificationEventLogger logger = FieldClassificationEventLogger.createLogger();
logger.startNewLogForRequest();
- logger.maybeSetLatencyMillis(
- SystemClock.elapsedRealtime() - startTime);
+ logger.maybeSetLatencyMillis(SystemClock.elapsedRealtime() - startTime);
logger.maybeSetAppPackageUid(uid);
logger.maybeSetNextFillRequestId(mFillRequestIdSnapshot + 1);
logger.maybeSetRequestId(sIdCounterForPcc.get());
diff --git a/services/core/java/com/android/server/notification/NotificationManagerInternal.java b/services/core/java/com/android/server/notification/NotificationManagerInternal.java
index f3d6a2dd0a75..d5d4070ee4c3 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerInternal.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerInternal.java
@@ -44,7 +44,7 @@ public interface NotificationManagerInternal {
void onConversationRemoved(String pkg, int uid, Set<String> shortcuts);
- /** Get the number of notification channels for a given package */
+ /** Get the number of app created notification channels for a given package */
int getNumNotificationChannelsForPackage(String pkg, int uid, boolean includeDeleted);
/** Does the specified package/uid have permission to post notifications? */
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 828e02ce3edc..62d762244617 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -4392,8 +4392,9 @@ public class NotificationManagerService extends SystemService {
List<NotificationChannel> channels = channelsList.getList();
final int channelsSize = channels.size();
ParceledListSlice<NotificationChannel> oldChannels =
- mPreferencesHelper.getNotificationChannels(pkg, uid, true);
- final boolean hadChannel = oldChannels != null && !oldChannels.getList().isEmpty();
+ mPreferencesHelper.getNotificationChannels(pkg, uid, true, false);
+ final boolean hadNonBundleChannel =
+ oldChannels != null && !oldChannels.getList().isEmpty();
boolean needsPolicyFileChange = false;
boolean hasRequestedNotificationPermission = false;
for (int i = 0; i < channelsSize; i++) {
@@ -4410,13 +4411,18 @@ public class NotificationManagerService extends SystemService {
mPreferencesHelper.getNotificationChannel(pkg, uid, channel.getId(),
false),
NOTIFICATION_CHANNEL_OR_GROUP_ADDED);
- boolean hasChannel = hadChannel || hasRequestedNotificationPermission;
- if (!hasChannel) {
+ boolean hasNonBundleChannel =
+ hadNonBundleChannel || hasRequestedNotificationPermission;
+ if (!hasNonBundleChannel) {
ParceledListSlice<NotificationChannel> currChannels =
- mPreferencesHelper.getNotificationChannels(pkg, uid, true);
- hasChannel = currChannels != null && !currChannels.getList().isEmpty();
- }
- if (!hadChannel && hasChannel && !hasRequestedNotificationPermission
+ mPreferencesHelper.getNotificationChannels(pkg, uid, true, false);
+ hasNonBundleChannel =
+ currChannels != null && !currChannels.getList().isEmpty();
+ }
+ // show perm prompt if new non-bundle channel added and the user has not
+ // seen the prompt
+ if (!hadNonBundleChannel && hasNonBundleChannel
+ && !hasRequestedNotificationPermission
&& startingTaskId != ActivityTaskManager.INVALID_TASK_ID) {
hasRequestedNotificationPermission = true;
if (mPermissionPolicyInternal == null) {
@@ -4651,7 +4657,7 @@ public class NotificationManagerService extends SystemService {
public ParceledListSlice<NotificationChannel> getNotificationChannelsForPackage(String pkg,
int uid, boolean includeDeleted) {
enforceSystemOrSystemUI("getNotificationChannelsForPackage");
- return mPreferencesHelper.getNotificationChannels(pkg, uid, includeDeleted);
+ return mPreferencesHelper.getNotificationChannels(pkg, uid, includeDeleted, true);
}
@Override
@@ -4783,7 +4789,7 @@ public class NotificationManagerService extends SystemService {
/* ignore */
}
return mPreferencesHelper.getNotificationChannels(
- targetPkg, targetUid, false /* includeDeleted */);
+ targetPkg, targetUid, false /* includeDeleted */, true);
}
throw new SecurityException("Pkg " + callingPkg
+ " cannot read channels for " + targetPkg + " in " + userId);
@@ -6652,7 +6658,7 @@ public class NotificationManagerService extends SystemService {
verifyPrivilegedListener(token, user, true);
return mPreferencesHelper.getNotificationChannels(pkg,
- getUidForPackageAndUser(pkg, user), false /* includeDeleted */);
+ getUidForPackageAndUser(pkg, user), false /* includeDeleted */, true);
}
@Override
@@ -7693,8 +7699,9 @@ public class NotificationManagerService extends SystemService {
}
int getNumNotificationChannelsForPackage(String pkg, int uid, boolean includeDeleted) {
- return mPreferencesHelper.getNotificationChannels(pkg, uid, includeDeleted).getList()
- .size();
+ // don't show perm prompt if the only channels are bundle channels
+ return mPreferencesHelper.getNotificationChannels(
+ pkg, uid, includeDeleted, false).getList().size();
}
void cancelNotificationInternal(String pkg, String opPkg, int callingUid, int callingPid,
@@ -8005,11 +8012,16 @@ public class NotificationManagerService extends SystemService {
}
/**
- * Returns a channel, if exists, and restores deleted conversation channels.
+ * Returns a channel, if exists and is not a bundle channel, and restores deleted
+ * conversation channels.
*/
@Nullable
private NotificationChannel getNotificationChannelRestoreDeleted(String pkg,
int callingUid, int notificationUid, String channelId, String conversationId) {
+ if (SYSTEM_RESERVED_IDS.contains(channelId)) {
+ // apps cannot post to these channels directly, in case they post incorrect content
+ return null;
+ }
// Restore a deleted conversation channel, if exists. Otherwise use the parent channel.
NotificationChannel channel = mPreferencesHelper.getConversationNotificationChannel(
pkg, notificationUid, channelId, conversationId,
diff --git a/services/core/java/com/android/server/notification/PreferencesHelper.java b/services/core/java/com/android/server/notification/PreferencesHelper.java
index 3349b1308c3f..c9edc4106943 100644
--- a/services/core/java/com/android/server/notification/PreferencesHelper.java
+++ b/services/core/java/com/android/server/notification/PreferencesHelper.java
@@ -1870,7 +1870,7 @@ public class PreferencesHelper implements RankingConfig {
@Override
public ParceledListSlice<NotificationChannel> getNotificationChannels(String pkg, int uid,
- boolean includeDeleted) {
+ boolean includeDeleted, boolean includeBundles) {
Objects.requireNonNull(pkg);
List<NotificationChannel> channels = new ArrayList<>();
synchronized (mLock) {
@@ -1882,7 +1882,9 @@ public class PreferencesHelper implements RankingConfig {
for (int i = 0; i < N; i++) {
final NotificationChannel nc = r.channels.valueAt(i);
if (includeDeleted || !nc.isDeleted()) {
- channels.add(nc);
+ if (includeBundles || !SYSTEM_RESERVED_IDS.contains(nc.getId())) {
+ channels.add(nc);
+ }
}
}
return new ParceledListSlice<>(channels);
diff --git a/services/core/java/com/android/server/notification/RankingConfig.java b/services/core/java/com/android/server/notification/RankingConfig.java
index 8df24c9911a6..001e91cbea12 100644
--- a/services/core/java/com/android/server/notification/RankingConfig.java
+++ b/services/core/java/com/android/server/notification/RankingConfig.java
@@ -55,5 +55,5 @@ public interface RankingConfig {
void permanentlyDeleteNotificationChannel(String pkg, int uid, String channelId);
void permanentlyDeleteNotificationChannels(String pkg, int uid);
ParceledListSlice<NotificationChannel> getNotificationChannels(String pkg, int uid,
- boolean includeDeleted);
+ boolean includeDeleted, boolean includeBundles);
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
index becb9fdabfcf..e845d80b412a 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -4838,7 +4838,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
null, mPkg, Process.myUserHandle());
verify(mPreferencesHelper, times(1)).getNotificationChannels(
- anyString(), anyInt(), anyBoolean());
+ anyString(), anyInt(), anyBoolean(), anyBoolean());
}
@Test
@@ -4856,7 +4856,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
}
verify(mPreferencesHelper, never()).getNotificationChannels(
- anyString(), anyInt(), anyBoolean());
+ anyString(), anyInt(), anyBoolean(), anyBoolean());
}
@Test
@@ -4871,7 +4871,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
null, mPkg, Process.myUserHandle());
verify(mPreferencesHelper, times(1)).getNotificationChannels(
- anyString(), anyInt(), anyBoolean());
+ anyString(), anyInt(), anyBoolean(), anyBoolean());
}
@Test
@@ -4891,7 +4891,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
}
verify(mPreferencesHelper, never()).getNotificationChannels(
- anyString(), anyInt(), anyBoolean());
+ anyString(), anyInt(), anyBoolean(), anyBoolean());
}
@Test
@@ -4913,7 +4913,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
}
verify(mPreferencesHelper, never()).getNotificationChannels(
- anyString(), anyInt(), anyBoolean());
+ anyString(), anyInt(), anyBoolean(), anyBoolean());
}
@Test
@@ -17062,4 +17062,20 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
assertThat(mService.hasFlag(captor.getValue().getNotification().flags,
FLAG_PROMOTED_ONGOING)).isFalse();
}
+
+ @Test
+ @EnableFlags(FLAG_NOTIFICATION_CLASSIFICATION)
+ public void testAppCannotUseReservedBundleChannels() throws Exception {
+ mBinderService.getBubblePreferenceForPackage(mPkg, mUid);
+ NotificationChannel news = mBinderService.getNotificationChannel(
+ mPkg, mContext.getUserId(), mPkg, NEWS_ID);
+ assertThat(news).isNotNull();
+
+ NotificationRecord nr = generateNotificationRecord(news);
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
+ nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
+ waitForIdle();
+
+ assertThat(mService.mNotificationList).isEmpty();
+ }
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
index 404ede676f02..b92bdb5f3e6e 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
@@ -2547,7 +2547,7 @@ public class PreferencesHelperTest extends UiServiceTestCase {
// Returns only non-deleted channels
List<NotificationChannel> channels =
- mHelper.getNotificationChannels(PKG_N_MR1, UID_N_MR1, false).getList();
+ mHelper.getNotificationChannels(PKG_N_MR1, UID_N_MR1, false, true).getList();
// Default channel + non-deleted channel + system defaults
assertEquals(notificationClassification() ? 6 : 2, channels.size());
for (NotificationChannel nc : channels) {
@@ -2557,7 +2557,7 @@ public class PreferencesHelperTest extends UiServiceTestCase {
}
// Returns deleted channels too
- channels = mHelper.getNotificationChannels(PKG_N_MR1, UID_N_MR1, true).getList();
+ channels = mHelper.getNotificationChannels(PKG_N_MR1, UID_N_MR1, true, true).getList();
// Includes system channel(s)
assertEquals(notificationClassification() ? 7 : 3, channels.size());
for (NotificationChannel nc : channels) {
@@ -3199,7 +3199,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
mHelper.permanentlyDeleteNotificationChannels(PKG_N_MR1, UID_N_MR1);
// Only default channel remains
- assertEquals(1, mHelper.getNotificationChannels(PKG_N_MR1, UID_N_MR1, true).getList().size());
+ assertEquals(1, mHelper.getNotificationChannels(PKG_N_MR1, UID_N_MR1, true, true)
+ .getList().size());
}
@Test
@@ -3315,12 +3316,12 @@ public class PreferencesHelperTest extends UiServiceTestCase {
// user 0 records remain
for (int i = 0; i < user0Uids.length; i++) {
assertEquals(notificationClassification() ? 5 : 1,
- mHelper.getNotificationChannels(PKG_N_MR1, user0Uids[i], false)
+ mHelper.getNotificationChannels(PKG_N_MR1, user0Uids[i], false, true)
.getList().size());
}
// user 1 records are gone
for (int i = 0; i < user1Uids.length; i++) {
- assertEquals(0, mHelper.getNotificationChannels(PKG_N_MR1, user1Uids[i], false)
+ assertEquals(0, mHelper.getNotificationChannels(PKG_N_MR1, user1Uids[i], false, true)
.getList().size());
}
}
@@ -3337,7 +3338,7 @@ public class PreferencesHelperTest extends UiServiceTestCase {
new int[]{UID_N_MR1}));
assertEquals(0, mHelper.getNotificationChannels(
- PKG_N_MR1, UID_N_MR1, true).getList().size());
+ PKG_N_MR1, UID_N_MR1, true, true).getList().size());
// Not deleted
mHelper.createNotificationChannel(PKG_N_MR1, UID_N_MR1, channel1, true, false,
@@ -3346,7 +3347,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
assertFalse(mHelper.onPackagesChanged(false, USER_SYSTEM,
new String[]{PKG_N_MR1}, new int[]{UID_N_MR1}));
assertEquals(notificationClassification() ? 6 : 2,
- mHelper.getNotificationChannels(PKG_N_MR1, UID_N_MR1, false).getList().size());
+ mHelper.getNotificationChannels(PKG_N_MR1, UID_N_MR1, false, true)
+ .getList().size());
}
@Test
@@ -3405,7 +3407,7 @@ public class PreferencesHelperTest extends UiServiceTestCase {
assertTrue(mHelper.canShowBadge(PKG_O, UID_O));
assertNull(mHelper.getNotificationDelegate(PKG_O, UID_O));
assertEquals(0, mHelper.getAppLockedFields(PKG_O, UID_O));
- assertEquals(0, mHelper.getNotificationChannels(PKG_O, UID_O, true).getList().size());
+ assertEquals(0, mHelper.getNotificationChannels(PKG_O, UID_O, true, true).getList().size());
assertEquals(0, mHelper.getNotificationChannelGroups(PKG_O, UID_O).size());
NotificationChannel channel = getChannel();
@@ -3419,7 +3421,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
public void testRecordDefaults() throws Exception {
assertEquals(true, mHelper.canShowBadge(PKG_N_MR1, UID_N_MR1));
assertEquals(notificationClassification() ? 5 : 1,
- mHelper.getNotificationChannels(PKG_N_MR1, UID_N_MR1, false).getList().size());
+ mHelper.getNotificationChannels(PKG_N_MR1, UID_N_MR1, false, true)
+ .getList().size());
}
@Test
@@ -6363,6 +6366,15 @@ public class PreferencesHelperTest extends UiServiceTestCase {
@Test
@EnableFlags(FLAG_NOTIFICATION_CLASSIFICATION)
+ public void testGetNotificationChannels_omitBundleChannels() {
+ // do something that triggers settings creation for an app
+ mHelper.setShowBadge(PKG_O, UID_O, true);
+
+ assertThat(mHelper.getNotificationChannels(PKG_O, UID_O, true, false).getList()).isEmpty();
+ }
+
+ @Test
+ @EnableFlags(FLAG_NOTIFICATION_CLASSIFICATION)
public void testNotificationBundles() {
// do something that triggers settings creation for an app
mHelper.setShowBadge(PKG_O, UID_O, true);
diff --git a/tests/Input/src/com/android/test/input/UinputRecordingIntegrationTests.kt b/tests/Input/src/com/android/test/input/UinputRecordingIntegrationTests.kt
index 9f4df90422eb..1a29c0f24edf 100644
--- a/tests/Input/src/com/android/test/input/UinputRecordingIntegrationTests.kt
+++ b/tests/Input/src/com/android/test/input/UinputRecordingIntegrationTests.kt
@@ -21,6 +21,7 @@ import android.cts.input.EventVerifier
import android.graphics.PointF
import android.hardware.input.InputManager
import android.os.ParcelFileDescriptor
+import android.platform.test.annotations.FlakyTest
import android.util.Log
import android.util.Size
import android.view.InputEvent
@@ -39,7 +40,6 @@ import com.android.cts.input.inputeventmatchers.withSource
import junit.framework.Assert.fail
import org.hamcrest.Matchers.allOf
import org.junit.Before
-import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TestName
@@ -108,7 +108,7 @@ class UinputRecordingIntegrationTests {
parser = InputJsonParser(instrumentation.context)
}
- @Ignore("b/366602644")
+ @FlakyTest(bugId = 366602644)
@Test
fun testEvemuRecording() {
VirtualDisplayActivityScenario.AutoClose<CaptureEventActivity>(