Merge "[DO NOT MERGE] Adding SystemUI's Custom Dynamic Tokens" into main
diff --git a/libs/input/PointerController.cpp b/libs/input/PointerController.cpp
index 43264db..f97992f 100644
--- a/libs/input/PointerController.cpp
+++ b/libs/input/PointerController.cpp
@@ -24,7 +24,6 @@
 #include <SkColor.h>
 #include <android-base/stringprintf.h>
 #include <android-base/thread_annotations.h>
-#include <com_android_input_flags.h>
 #include <ftl/enum.h>
 
 #include <mutex>
@@ -35,14 +34,10 @@
 #define INDENT2 "    "
 #define INDENT3 "      "
 
-namespace input_flags = com::android::input::flags;
-
 namespace android {
 
 namespace {
 
-static const bool ENABLE_POINTER_CHOREOGRAPHER = input_flags::enable_pointer_choreographer();
-
 const ui::Transform kIdentityTransform;
 
 } // namespace
@@ -68,27 +63,24 @@
 
 std::shared_ptr<PointerController> PointerController::create(
         const sp<PointerControllerPolicyInterface>& policy, const sp<Looper>& looper,
-        SpriteController& spriteController, bool enabled, ControllerType type) {
+        SpriteController& spriteController, ControllerType type) {
     // using 'new' to access non-public constructor
     std::shared_ptr<PointerController> controller;
     switch (type) {
         case ControllerType::MOUSE:
             controller = std::shared_ptr<PointerController>(
-                    new MousePointerController(policy, looper, spriteController, enabled));
+                    new MousePointerController(policy, looper, spriteController));
             break;
         case ControllerType::TOUCH:
             controller = std::shared_ptr<PointerController>(
-                    new TouchPointerController(policy, looper, spriteController, enabled));
+                    new TouchPointerController(policy, looper, spriteController));
             break;
         case ControllerType::STYLUS:
             controller = std::shared_ptr<PointerController>(
-                    new StylusPointerController(policy, looper, spriteController, enabled));
+                    new StylusPointerController(policy, looper, spriteController));
             break;
-        case ControllerType::LEGACY:
         default:
-            controller = std::shared_ptr<PointerController>(
-                    new PointerController(policy, looper, spriteController, enabled));
-            break;
+            LOG_ALWAYS_FATAL("Invalid ControllerType: %d", static_cast<int>(type));
     }
 
     /*
@@ -108,10 +100,9 @@
 }
 
 PointerController::PointerController(const sp<PointerControllerPolicyInterface>& policy,
-                                     const sp<Looper>& looper, SpriteController& spriteController,
-                                     bool enabled)
+                                     const sp<Looper>& looper, SpriteController& spriteController)
       : PointerController(
-                policy, looper, spriteController, enabled,
+                policy, looper, spriteController,
                 [](const sp<android::gui::WindowInfosListener>& listener) {
                     auto initialInfo = std::make_pair(std::vector<android::gui::WindowInfo>{},
                                                       std::vector<android::gui::DisplayInfo>{});
@@ -125,11 +116,9 @@
 
 PointerController::PointerController(const sp<PointerControllerPolicyInterface>& policy,
                                      const sp<Looper>& looper, SpriteController& spriteController,
-                                     bool enabled,
                                      const WindowListenerRegisterConsumer& registerListener,
                                      WindowListenerUnregisterConsumer unregisterListener)
-      : mEnabled(enabled),
-        mContext(policy, looper, spriteController, *this),
+      : mContext(policy, looper, spriteController, *this),
         mCursorController(mContext),
         mDisplayInfoListener(sp<DisplayInfoListener>::make(this)),
         mUnregisterWindowInfosListener(std::move(unregisterListener)) {
@@ -149,14 +138,10 @@
 }
 
 std::optional<FloatRect> PointerController::getBounds() const {
-    if (!mEnabled) return {};
-
     return mCursorController.getBounds();
 }
 
 void PointerController::move(float deltaX, float deltaY) {
-    if (!mEnabled) return;
-
     const int32_t displayId = mCursorController.getDisplayId();
     vec2 transformed;
     {
@@ -168,8 +153,6 @@
 }
 
 void PointerController::setPosition(float x, float y) {
-    if (!mEnabled) return;
-
     const int32_t displayId = mCursorController.getDisplayId();
     vec2 transformed;
     {
@@ -181,10 +164,6 @@
 }
 
 FloatPoint PointerController::getPosition() const {
-    if (!mEnabled) {
-        return FloatPoint{0, 0};
-    }
-
     const int32_t displayId = mCursorController.getDisplayId();
     const auto p = mCursorController.getPosition();
     {
@@ -195,28 +174,20 @@
 }
 
 int32_t PointerController::getDisplayId() const {
-    if (!mEnabled) return ADISPLAY_ID_NONE;
-
     return mCursorController.getDisplayId();
 }
 
 void PointerController::fade(Transition transition) {
-    if (!mEnabled) return;
-
     std::scoped_lock lock(getLock());
     mCursorController.fade(transition);
 }
 
 void PointerController::unfade(Transition transition) {
-    if (!mEnabled) return;
-
     std::scoped_lock lock(getLock());
     mCursorController.unfade(transition);
 }
 
 void PointerController::setPresentation(Presentation presentation) {
-    if (!mEnabled) return;
-
     std::scoped_lock lock(getLock());
 
     if (mLocked.presentation == presentation) {
@@ -225,33 +196,13 @@
 
     mLocked.presentation = presentation;
 
-    if (ENABLE_POINTER_CHOREOGRAPHER) {
-        // When pointer choreographer is enabled, the presentation mode is only set once when the
-        // PointerController is constructed, before the display viewport is provided.
-        // TODO(b/293587049): Clean up the PointerController interface after pointer choreographer
-        // is permanently enabled. The presentation can be set in the constructor.
-        mCursorController.setStylusHoverMode(presentation == Presentation::STYLUS_HOVER);
-        return;
-    }
-
-    if (!mCursorController.isViewportValid()) {
-        return;
-    }
-
-    if (presentation == Presentation::POINTER || presentation == Presentation::STYLUS_HOVER) {
-        // For now, we support stylus hover using the mouse cursor implementation.
-        // TODO: Add proper support for stylus hover icons.
-        mCursorController.setStylusHoverMode(presentation == Presentation::STYLUS_HOVER);
-
-        mCursorController.getAdditionalMouseResources();
-        clearSpotsLocked();
-    }
+    // The presentation mode is only set once when the PointerController is constructed,
+    // before the display viewport is provided.
+    mCursorController.setStylusHoverMode(presentation == Presentation::STYLUS_HOVER);
 }
 
 void PointerController::setSpots(const PointerCoords* spotCoords, const uint32_t* spotIdToIndex,
                                  BitSet32 spotIdBits, int32_t displayId) {
-    if (!mEnabled) return;
-
     std::scoped_lock lock(getLock());
     std::array<PointerCoords, MAX_POINTERS> outSpotCoords{};
     const ui::Transform& transform = getTransformForDisplayLocked(displayId);
@@ -278,8 +229,6 @@
 }
 
 void PointerController::clearSpots() {
-    if (!mEnabled) return;
-
     std::scoped_lock lock(getLock());
     clearSpotsLocked();
 }
@@ -328,22 +277,16 @@
 }
 
 void PointerController::updatePointerIcon(PointerIconStyle iconId) {
-    if (!mEnabled) return;
-
     std::scoped_lock lock(getLock());
     mCursorController.updatePointerIcon(iconId);
 }
 
 void PointerController::setCustomPointerIcon(const SpriteIcon& icon) {
-    if (!mEnabled) return;
-
     std::scoped_lock lock(getLock());
     mCursorController.setCustomPointerIcon(icon);
 }
 
 void PointerController::setSkipScreenshot(int32_t displayId, bool skip) {
-    if (!mEnabled) return;
-
     std::scoped_lock lock(getLock());
     if (skip) {
         mLocked.displaysToSkipScreenshot.insert(displayId);
@@ -392,10 +335,6 @@
 }
 
 std::string PointerController::dump() {
-    if (!mEnabled) {
-        return INDENT "PointerController: DISABLED due to ongoing PointerChoreographer refactor\n";
-    }
-
     std::string dump = INDENT "PointerController:\n";
     std::scoped_lock lock(getLock());
     dump += StringPrintf(INDENT2 "Presentation: %s\n",
@@ -416,8 +355,8 @@
 
 MousePointerController::MousePointerController(const sp<PointerControllerPolicyInterface>& policy,
                                                const sp<Looper>& looper,
-                                               SpriteController& spriteController, bool enabled)
-      : PointerController(policy, looper, spriteController, enabled) {
+                                               SpriteController& spriteController)
+      : PointerController(policy, looper, spriteController) {
     PointerController::setPresentation(Presentation::POINTER);
 }
 
@@ -429,8 +368,8 @@
 
 TouchPointerController::TouchPointerController(const sp<PointerControllerPolicyInterface>& policy,
                                                const sp<Looper>& looper,
-                                               SpriteController& spriteController, bool enabled)
-      : PointerController(policy, looper, spriteController, enabled) {
+                                               SpriteController& spriteController)
+      : PointerController(policy, looper, spriteController) {
     PointerController::setPresentation(Presentation::SPOT);
 }
 
@@ -442,8 +381,8 @@
 
 StylusPointerController::StylusPointerController(const sp<PointerControllerPolicyInterface>& policy,
                                                  const sp<Looper>& looper,
-                                                 SpriteController& spriteController, bool enabled)
-      : PointerController(policy, looper, spriteController, enabled) {
+                                                 SpriteController& spriteController)
+      : PointerController(policy, looper, spriteController) {
     PointerController::setPresentation(Presentation::STYLUS_HOVER);
 }
 
diff --git a/libs/input/PointerController.h b/libs/input/PointerController.h
index d76ca5d..eaf34d5 100644
--- a/libs/input/PointerController.h
+++ b/libs/input/PointerController.h
@@ -47,8 +47,7 @@
 public:
     static std::shared_ptr<PointerController> create(
             const sp<PointerControllerPolicyInterface>& policy, const sp<Looper>& looper,
-            SpriteController& spriteController, bool enabled,
-            ControllerType type = ControllerType::LEGACY);
+            SpriteController& spriteController, ControllerType type);
 
     ~PointerController() override;
 
@@ -87,12 +86,12 @@
 
     // Constructor used to test WindowInfosListener registration.
     PointerController(const sp<PointerControllerPolicyInterface>& policy, const sp<Looper>& looper,
-                      SpriteController& spriteController, bool enabled,
+                      SpriteController& spriteController,
                       const WindowListenerRegisterConsumer& registerListener,
                       WindowListenerUnregisterConsumer unregisterListener);
 
     PointerController(const sp<PointerControllerPolicyInterface>& policy, const sp<Looper>& looper,
-                      SpriteController& spriteController, bool enabled);
+                      SpriteController& spriteController);
 
 private:
     friend PointerControllerContext::LooperCallback;
@@ -104,8 +103,6 @@
     // we use the DisplayInfoListener's lock in PointerController.
     std::mutex& getLock() const;
 
-    const bool mEnabled;
-
     PointerControllerContext mContext;
 
     MouseCursorController mCursorController;
@@ -144,8 +141,7 @@
 public:
     /** A version of PointerController that controls one mouse pointer. */
     MousePointerController(const sp<PointerControllerPolicyInterface>& policy,
-                           const sp<Looper>& looper, SpriteController& spriteController,
-                           bool enabled);
+                           const sp<Looper>& looper, SpriteController& spriteController);
 
     ~MousePointerController() override;
 
@@ -164,8 +160,7 @@
 public:
     /** A version of PointerController that controls touch spots. */
     TouchPointerController(const sp<PointerControllerPolicyInterface>& policy,
-                           const sp<Looper>& looper, SpriteController& spriteController,
-                           bool enabled);
+                           const sp<Looper>& looper, SpriteController& spriteController);
 
     ~TouchPointerController() override;
 
@@ -210,8 +205,7 @@
 public:
     /** A version of PointerController that controls one stylus pointer. */
     StylusPointerController(const sp<PointerControllerPolicyInterface>& policy,
-                            const sp<Looper>& looper, SpriteController& spriteController,
-                            bool enabled);
+                            const sp<Looper>& looper, SpriteController& spriteController);
 
     ~StylusPointerController() override;
 
diff --git a/libs/input/tests/PointerController_test.cpp b/libs/input/tests/PointerController_test.cpp
index 9574e79..3bc0e24 100644
--- a/libs/input/tests/PointerController_test.cpp
+++ b/libs/input/tests/PointerController_test.cpp
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 
-#include <com_android_input_flags.h>
 #include <flag_macros.h>
 #include <gmock/gmock.h>
 #include <gtest/gtest.h>
@@ -30,8 +29,6 @@
 
 namespace android {
 
-namespace input_flags = com::android::input::flags;
-
 enum TestCursorType {
     CURSOR_TYPE_DEFAULT = 0,
     CURSOR_TYPE_HOVER,
@@ -150,7 +147,6 @@
                           SpriteController& spriteController)
           : PointerController(
                     policy, looper, spriteController,
-                    /*enabled=*/true,
                     [&registeredListener](const sp<android::gui::WindowInfosListener>& listener)
                             -> std::vector<gui::DisplayInfo> {
                         // Register listener
@@ -258,8 +254,7 @@
     mPointerController->reloadPointerResources();
 }
 
-TEST_F_WITH_FLAGS(PointerControllerTest, setPresentationBeforeDisplayViewportDoesNotLoadResources,
-                  REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(input_flags, enable_pointer_choreographer))) {
+TEST_F(PointerControllerTest, setPresentationBeforeDisplayViewportDoesNotLoadResources) {
     // Setting the presentation mode before a display viewport is set will not load any resources.
     mPointerController->setPresentation(PointerController::Presentation::POINTER);
     ASSERT_TRUE(mPolicy->noResourcesAreLoaded());
@@ -269,26 +264,7 @@
     ASSERT_TRUE(mPolicy->allResourcesAreLoaded());
 }
 
-TEST_F_WITH_FLAGS(PointerControllerTest, updatePointerIcon,
-                  REQUIRES_FLAGS_DISABLED(ACONFIG_FLAG(input_flags,
-                                                       enable_pointer_choreographer))) {
-    ensureDisplayViewportIsSet();
-    mPointerController->setPresentation(PointerController::Presentation::POINTER);
-    mPointerController->unfade(PointerController::Transition::IMMEDIATE);
-
-    int32_t type = CURSOR_TYPE_ADDITIONAL;
-    std::pair<float, float> hotspot = getHotSpotCoordinatesForType(type);
-    EXPECT_CALL(*mPointerSprite, setVisible(true));
-    EXPECT_CALL(*mPointerSprite, setAlpha(1.0f));
-    EXPECT_CALL(*mPointerSprite,
-                setIcon(AllOf(Field(&SpriteIcon::style, static_cast<PointerIconStyle>(type)),
-                              Field(&SpriteIcon::hotSpotX, hotspot.first),
-                              Field(&SpriteIcon::hotSpotY, hotspot.second))));
-    mPointerController->updatePointerIcon(static_cast<PointerIconStyle>(type));
-}
-
-TEST_F_WITH_FLAGS(PointerControllerTest, updatePointerIconWithChoreographer,
-                  REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(input_flags, enable_pointer_choreographer))) {
+TEST_F(PointerControllerTest, updatePointerIconWithChoreographer) {
     // When PointerChoreographer is enabled, the presentation mode is set before the viewport.
     mPointerController->setPresentation(PointerController::Presentation::POINTER);
     ensureDisplayViewportIsSet();
diff --git a/nfc/java/android/nfc/cardemulation/CardEmulation.java b/nfc/java/android/nfc/cardemulation/CardEmulation.java
index de9eada1..2fe2ce3 100644
--- a/nfc/java/android/nfc/cardemulation/CardEmulation.java
+++ b/nfc/java/android/nfc/cardemulation/CardEmulation.java
@@ -1212,16 +1212,16 @@
      *
      * @param service The ComponentName of the service
      * @param status  true to enable, false to disable
+     * @param userId the user handle of the user whose information is being requested.
      * @return set service for the category and true if service is already set return false.
      *
      * @hide
      */
-    public boolean setServiceEnabledForCategoryOther(ComponentName service, boolean status) {
+    public boolean setServiceEnabledForCategoryOther(ComponentName service, boolean status,
+                                                     int userId) {
         if (service == null) {
             throw new NullPointerException("activity or service or category is null");
         }
-        int userId = mContext.getUser().getIdentifier();
-
         try {
             return sService.setServiceEnabledForCategoryOther(userId, service, status);
         } catch (RemoteException e) {
diff --git a/packages/SystemUI/aconfig/systemui.aconfig b/packages/SystemUI/aconfig/systemui.aconfig
index de090f4..21881f6 100644
--- a/packages/SystemUI/aconfig/systemui.aconfig
+++ b/packages/SystemUI/aconfig/systemui.aconfig
@@ -171,16 +171,6 @@
 }
 
 flag {
-    name: "nssl_falsing_fix"
-    namespace: "systemui"
-    description: "Minor touch changes to prevent falsing errors in NSSL"
-    bug: "316551193"
-    metadata {
-        purpose: PURPOSE_BUGFIX
-    }
-}
-
-flag {
     name: "refactor_get_current_user"
     namespace: "systemui"
     description: "KeyguardUpdateMonitor.getCurrentUser() was providing outdated results."
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt
index f3852a2..4fd0df4 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt
@@ -186,7 +186,8 @@
     private val locInScreen = IntArray(2)
 
     /** Visuo-haptic long-press effects */
-    private var haveLongPressPropertiesBeenReset = true
+    var haveLongPressPropertiesBeenReset = true
+        private set
     private var paddingForLaunch = Rect()
     private var initialLongPressProperties: QSLongPressProperties? = null
     private var finalLongPressProperties: QSLongPressProperties? = null
@@ -772,7 +773,11 @@
         }
     }
 
-    override fun onActivityLaunchAnimationEnd() = resetLongPressEffectProperties()
+    override fun onActivityLaunchAnimationEnd() {
+        if (longPressEffect != null && !haveLongPressPropertiesBeenReset) {
+            resetLongPressEffectProperties()
+        }
+    }
 
     fun prepareForLaunch() {
         val startingHeight = initialLongPressProperties?.height?.toInt() ?: 0
@@ -877,8 +882,8 @@
         background.updateBounds(
             left = 0,
             top = 0,
-            right = initialLongPressProperties?.width?.toInt() ?: 0,
-            bottom = initialLongPressProperties?.height?.toInt() ?: 0,
+            right = initialLongPressProperties?.width?.toInt() ?: measuredWidth,
+            bottom = initialLongPressProperties?.height?.toInt() ?: measuredHeight,
         )
         changeCornerRadius(resources.getDimensionPixelSize(R.dimen.qs_corner_radius).toFloat())
         setAllColors(
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt
index 222b070..14e14f4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt
@@ -14,7 +14,6 @@
 import androidx.annotation.VisibleForTesting
 import com.android.systemui.Dumpable
 import com.android.systemui.ExpandHelper
-import com.android.systemui.Flags.nsslFalsingFix
 import com.android.systemui.Gefingerpoken
 import com.android.systemui.biometrics.UdfpsKeyguardViewControllerLegacy
 import com.android.systemui.classifier.Classifier
@@ -884,9 +883,7 @@
                     isDraggingDown = false
                     isTrackpadReverseScroll = false
                     shadeRepository.setLegacyLockscreenShadeTracking(false)
-                    if (nsslFalsingFix() || MigrateClocksToBlueprint.isEnabled) {
-                        return true
-                    }
+                    return true
                 } else {
                     stopDragging()
                     return false
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 3011bc2..c1c63cd 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
@@ -23,7 +23,6 @@
 import static com.android.internal.jank.InteractionJankMonitor.CUJ_NOTIFICATION_SHADE_SCROLL_FLING;
 import static com.android.server.notification.Flags.screenshareNotificationHiding;
 import static com.android.systemui.Dependency.ALLOW_NOTIFICATION_LONG_PRESS_NAME;
-import static com.android.systemui.Flags.nsslFalsingFix;
 import static com.android.systemui.statusbar.StatusBarState.KEYGUARD;
 import static com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout.OnEmptySpaceClickListener;
 import static com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout.OnOverscrollTopChangedListener;
@@ -2062,32 +2061,18 @@
             }
             boolean horizontalSwipeWantsIt = false;
             boolean scrollerWantsIt = false;
-            if (nsslFalsingFix() || MigrateClocksToBlueprint.isEnabled()) {
-                // Reverse the order relative to the else statement. onScrollTouch will reset on an
-                // UP event, causing horizontalSwipeWantsIt to be set to true on vertical swipes.
-                if (mLongPressedView == null && !mView.isBeingDragged()
-                        && !expandingNotification
-                        && !mView.getExpandedInThisMotion()
-                        && !onlyScrollingInThisMotion
-                        && !mView.getDisallowDismissInThisMotion()) {
-                    horizontalSwipeWantsIt = mSwipeHelper.onTouchEvent(ev);
-                }
-                if (mLongPressedView == null && mView.isExpanded() && !mSwipeHelper.isSwiping()
-                        && !expandingNotification && !mView.getDisallowScrollingInThisMotion()) {
-                    scrollerWantsIt = mView.onScrollTouch(ev);
-                }
-            } else {
-                if (mLongPressedView == null && mView.isExpanded() && !mSwipeHelper.isSwiping()
-                        && !expandingNotification && !mView.getDisallowScrollingInThisMotion()) {
-                    scrollerWantsIt = mView.onScrollTouch(ev);
-                }
-                if (mLongPressedView == null && !mView.isBeingDragged()
-                        && !expandingNotification
-                        && !mView.getExpandedInThisMotion()
-                        && !onlyScrollingInThisMotion
-                        && !mView.getDisallowDismissInThisMotion()) {
-                    horizontalSwipeWantsIt = mSwipeHelper.onTouchEvent(ev);
-                }
+            // 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.
+            if (mLongPressedView == null && !mView.isBeingDragged()
+                    && !expandingNotification
+                    && !mView.getExpandedInThisMotion()
+                    && !onlyScrollingInThisMotion
+                    && !mView.getDisallowDismissInThisMotion()) {
+                horizontalSwipeWantsIt = mSwipeHelper.onTouchEvent(ev);
+            }
+            if (mLongPressedView == null && mView.isExpanded() && !mSwipeHelper.isSwiping()
+                    && !expandingNotification && !mView.getDisallowScrollingInThisMotion()) {
+                scrollerWantsIt = mView.onScrollTouch(ev);
             }
 
             // Check if we need to clear any snooze leavebehinds
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileViewImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileViewImplTest.kt
index b5ef8c2..db11c3e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileViewImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileViewImplTest.kt
@@ -500,6 +500,42 @@
         )
     }
 
+    @Test
+    fun onActivityLaunchAnimationEnd_onFreshTile_longPressPropertiesAreReset() {
+        // WHEN an activity launch animation ends on a fresh tile
+        tileView.onActivityLaunchAnimationEnd()
+
+        // THEN the tile's long-press effect properties are reset by default
+        assertThat(tileView.haveLongPressPropertiesBeenReset).isTrue()
+    }
+
+    @Test
+    fun onUpdateLongPressEffectProperties_duringLongPressEffect_propertiesAreNotReset() {
+        // GIVEN a state that supports long-press
+        val state = QSTile.State()
+        tileView.changeState(state)
+
+        // WHEN the long-press effect is updating the properties
+        tileView.updateLongPressEffectProperties(1f)
+
+        // THEN the tile's long-press effect properties haven't reset
+        assertThat(tileView.haveLongPressPropertiesBeenReset).isFalse()
+    }
+
+    @Test
+    fun onActivityLaunchAnimationEnd_afterLongPressEffect_longPressPropertiesAreReset() {
+        // GIVEN a state that supports long-press and the long-press effect updating
+        val state = QSTile.State()
+        tileView.changeState(state)
+        tileView.updateLongPressEffectProperties(1f)
+
+        // WHEN an activity launch animation ends on a fresh tile
+        tileView.onActivityLaunchAnimationEnd()
+
+        // THEN the tile's long-press effect properties are reset
+        assertThat(tileView.haveLongPressPropertiesBeenReset).isTrue()
+    }
+
     class FakeTileView(
         context: Context,
         collapsed: Boolean,
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
index 1b9d6c5..0fde760 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
@@ -2234,7 +2234,7 @@
             mInputManagerInternal.notifyInputMethodConnectionActive(connectionIsActive);
         }
         final var userData = mUserDataRepository.getOrCreate(mCurrentUserId);
-
+        final var bindingController = userData.mBindingController;
 
         // If configured, we want to avoid starting up the IME if it is not supposed to be showing
         if (shouldPreventImeStartupLocked(selectedMethodId, startInputFlags,
@@ -2243,7 +2243,7 @@
                 Slog.d(TAG, "Avoiding IME startup and unbinding current input method.");
             }
             invalidateAutofillSessionLocked();
-            userData.mBindingController.unbindCurrentMethod();
+            bindingController.unbindCurrentMethod();
             return InputBindResult.NO_EDITOR;
         }
 
@@ -2275,8 +2275,8 @@
             }
         }
 
-        userData.mBindingController.unbindCurrentMethod();
-        return userData.mBindingController.bindCurrentMethod();
+        bindingController.unbindCurrentMethod();
+        return bindingController.bindCurrentMethod();
     }
 
     /**
diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp
index 9aa71b6..fac08eb 100644
--- a/services/core/jni/com_android_server_input_InputManagerService.cpp
+++ b/services/core/jni/com_android_server_input_InputManagerService.cpp
@@ -761,8 +761,7 @@
     std::scoped_lock _l(mLock);
     ensureSpriteControllerLocked();
     std::shared_ptr<PointerController> pc =
-            PointerController::create(this, mLooper, *mLocked.spriteController, /*enabled=*/true,
-                                      type);
+            PointerController::create(this, mLooper, *mLocked.spriteController, type);
     mLocked.pointerControllers.emplace_back(pc);
     return pc;
 }